我对Ruby很新,并且总是假设这两个符号是一种内插实例变量的相同方式,直到我注意到以下示例代码中对于'供应商'参数。
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&#39 ;:未定义的局部变量或方法`vendor'对于#(NameError)
class Component
def initialize(name, version)
@vendor = "vendor"
@name = name
@version = version
puts "#{@vendor}-#{@name}-#{@version}"
end
end
Component.new("param1", "param2")
=>这也有效
答案 0 :(得分:7)
#{(expression)}
是重要的。
如果表达式为#{name}
,则替换变量name
,在所有示例中,变量都来自输入到方法中的参数。
如果表达式为#{@name}
,则表示替换方法第四行中定义的变量@name
。
@#{name}
不是特殊构造。它只是字符串@
,后跟变量name
的内容。
你在第二个例子中没有工作的原因是你根本没有定义变量vendor
。
答案 1 :(得分:2)
以下是我能想到的所有例子:
@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