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