2014-02-14 2 views
3

У меня есть класс. Метод бар должен принимать аргумент Foo со значением по умолчанию, равным @fooRuby аргументы ключевого слова

class Foo 
    attr_accessor :foo 

    def bar(foo: foo) 
    p foo 
    end 
end 

В IRB я выполняю:

> f = Foo.new 
> f.foo = 'foobar' 
> f.bar 

Для рубинового 2.0 результата:

=> "foobar" 

и рубин 2.1:

=> nil 

Кто может это объяснить havior?

+0

Я могу поспорить, что в первую очередь кода с ошибкой броска –

+0

определение функции бар (Foo: Foo) ', что это –

+1

@RajarshiDas это определение метода , –

ответ

3

Дальнейшие исследования:

# (Ruby 2.1.0) 
class Foo 
    attr_accessor :foo 

    def bar(foo: self.foo) 
    foo 
    end 
end 
f = Foo.new 
f.foo = 'bar' 
f.bar 
# => "bar" 

кажется Руби 2.1.0 «инициализирует» локальную переменную перед вычислением «правая сторона» этого заявления, так foo с правой стороны, рассматривается как локальная переменная, и, таким образом, оценивается как nil.

Этот эксперимент, похоже, подтверждает мою гипотезу:

class Foo 
    attr_accessor :foo 
    def bar(foo: defined?(foo)) 
    foo 
    end 
end 
# Ruby 2.0.0: 
Foo.new.bar 
# => "method" 
# Ruby 2.1.0: 
Foo.new.bar 
# => "local-variable" 
+0

спасибо, мне это помогает :) – user3309314

+2

Разница между Ruby 2.0 и Ruby 2.1 заключается в том, что в последнем случае вы можете установить обязательные аргументы ключевых слов. Разница в вопросе может или не может быть связана с этим. Я не знаю. – sawa

+0

Я использую его для переопределения переменных экземпляра методом вызова метода – user3309314

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