Ruby中的“#@{var}”和“@#{var}”有什么区别?
What's the difference between "#@{var}" and "@#{var}" in Ruby?
我是 Ruby 的新手,一直认为这两种表示法是插入实例变量的相同方法,直到我注意到下面示例代码中 'vendor' 参数的差异。
class Component
def initialize(name, version)
@vendor = "vendor"
@name = name
@version = version
puts "#{@vendor}-@#{name}-@#{version}"
end
end
ConfiguredComponent.new("param1", "param2")
=> 这行得通
class Component
def initialize(name, version)
@vendor = "vendor"
@name = name
@version = version
puts "@#{vendor}-@#{name}-@#{version}"
end
end
ConfiguredComponent.new("param1", "param2")
=> 使用@#{vendor} 符号不起作用=> :in 'initialize': # (NameError)[=23= 的未定义局部变量或方法`vendor' ]
class Component
def initialize(name, version)
@vendor = "vendor"
@name = name
@version = version
puts "#{@vendor}-#{@name}-#{@version}"
end
end
Component.new("param1", "param2")
=> 这也有效
重要的是#{(expression)}
。
如果表达式是 #{name}
那么这就是替换变量 name
,在您的所有示例中,该变量都来自输入到方法中的参数。
如果表达式是 #{@name}
那么这将替换在您的方法的第四行中定义的变量 @name
。
@#{name}
不是一个特殊的结构。它只是字符串 @
后跟变量的内容 name
.
它在您的第二个示例中不起作用的原因是您根本没有定义变量 vendor
。
以下是我能想到的所有示例:
@a = "hello"
strings =[
"@a world",
"@{a} world",
"#a world",
"#{@a} world",
"#@a world",
"#@aworld", # ! Will not output anything (no space after "@a", and @aworld isn't defined ) !
"@#{@a} world"
]
puts strings
它输出:
@a world
@{a} world
#a world
hello world
hello world
@hello world
但是:
puts "@#{a} world"
抛出异常:
undefined local variable or method `a' for main:Object (NameError)
a
需要是定义的变量或方法 :
class Test
attr_accessor :a
def greetings
puts "#{a} world"
end
end
t = Test.new
t.a = "hello"
t.greetings # hello world
我是 Ruby 的新手,一直认为这两种表示法是插入实例变量的相同方法,直到我注意到下面示例代码中 'vendor' 参数的差异。
class Component
def initialize(name, version)
@vendor = "vendor"
@name = name
@version = version
puts "#{@vendor}-@#{name}-@#{version}"
end
end
ConfiguredComponent.new("param1", "param2")
=> 这行得通
class Component
def initialize(name, version)
@vendor = "vendor"
@name = name
@version = version
puts "@#{vendor}-@#{name}-@#{version}"
end
end
ConfiguredComponent.new("param1", "param2")
=> 使用@#{vendor} 符号不起作用=> :in 'initialize': # (NameError)[=23= 的未定义局部变量或方法`vendor' ]
class Component
def initialize(name, version)
@vendor = "vendor"
@name = name
@version = version
puts "#{@vendor}-#{@name}-#{@version}"
end
end
Component.new("param1", "param2")
=> 这也有效
重要的是#{(expression)}
。
如果表达式是 #{name}
那么这就是替换变量 name
,在您的所有示例中,该变量都来自输入到方法中的参数。
如果表达式是 #{@name}
那么这将替换在您的方法的第四行中定义的变量 @name
。
@#{name}
不是一个特殊的结构。它只是字符串 @
后跟变量的内容 name
.
它在您的第二个示例中不起作用的原因是您根本没有定义变量 vendor
。
以下是我能想到的所有示例:
@a = "hello"
strings =[
"@a world",
"@{a} world",
"#a world",
"#{@a} world",
"#@a world",
"#@aworld", # ! Will not output anything (no space after "@a", and @aworld isn't defined ) !
"@#{@a} world"
]
puts strings
它输出:
@a world
@{a} world
#a world
hello world
hello world
@hello world
但是:
puts "@#{a} world"
抛出异常:
undefined local variable or method `a' for main:Object (NameError)
a
需要是定义的变量或方法 :
class Test
attr_accessor :a
def greetings
puts "#{a} world"
end
end
t = Test.new
t.a = "hello"
t.greetings # hello world