"#@ {var}"之间的区别是什么?和" @#{var}"在Ruby?

时间:2016-12-28 14:11:37

标签: ruby string-interpolation

我对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")

=>这也有效

2 个答案:

答案 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