2014-02-14 83 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 

对Ruby 2.0的结果是:

=> "foobar" 

和红宝石2.1:

=> nil 

谁能解释这一点havior?

+0

我可以打赌,你先用抛错误 –

+0

'高清酒吧所有的代码(富:富)'这是什么 –

+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