2016-12-28 2 views
1

Я новичок в Ruby и всегда предполагал, что эти две нотации были идентичным способом интерполирования переменных экземпляра, пока я не заметил разницу в приведенном ниже примере для параметра «vendor».В чем разница между «# @ {var}» и «@ # {var}» в Ruby?

class Component 
    def initialize(name, version) 
     @vendor = "vendor" 
     @name = name 
     @version = version 
     puts "#{@vendor}[email protected]#{name}[email protected]#{version}" 
    end 
end 

ConfiguredComponent.new("param1", "param2") 

=> это работает

class Component 
    def initialize(name, version) 
     @vendor = "vendor" 
     @name = name 
     @version = version 
     puts "@#{vendor}[email protected]#{name}[email protected]#{version}" 
    end 
end 

ConfiguredComponent.new("param1", "param2") 

=> используя @ # {} поставщика обозначения does't работы =>: в 'инициализации': неопределенную локальную переменную или метод `поставщика» для # (NameError)

class Component 
    def initialize(name, version) 
     @vendor = "vendor" 
     @name = name 
     @version = version 
     puts "#{@vendor}-#{@name}-#{@version}" 
    end 
    end 

    Component.new("param1", "param2") 

=> это также работает

ответ

7

это #{(expression)} Это важно.

Если выражение равно #{name}, то это заменяет переменную name, которая во всех ваших примерах поступает из параметров, вводимых в метод.

Если выражение равно #{@name}, то это заменяет переменную @name, которая определена в четвертой строке ваших методов.

@#{name} не является специальной конструкцией. Это только строка @, за которой следует содержимое переменной name.

Причина, по которой это не сработало в вашем втором примере, состоит в том, что вы просто не определили переменную vendor.

+0

Это ответ. – Tass

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 
+1

Ничего себе, не знал о интерполяции «# @ a», но понял, почему это может быть неинтуитивно (включил его в ваш пример). – Felix

+1

Да, я думаю, что «# @ a» в основном используется в ошибках :) –

Смежные вопросы