2017-02-15 98 views
0

我真搞不清楚在Ruby中的分配方法。在文档中,它说:困惑在Ruby中的分配方法(定义法等号)

以等号结尾的方法表示分配方法。 对于分配方法,返回值被忽略,并且参数 的,而不是返回。

我知道这可能是用作类setter方法。不过,我仍然对这个概念感到困惑。在下面的代码中:

class Foo 
    # setter method 
    def foo=(x) 
    puts "OK: x=#{x}" 
    end 
end 
f = Foo.new 
f.foo = 123 # OK: x=123 

def a=(value) 
    puts "value is #{value}" 
end 
a = 123  # why there is no output? 
p a   # 123, why this only return the argument? 
p a = 123 # 123, why this only return the argument? 

为什么等号方法在类中和类外运行方式不同?

回答

4

一个= 123

原则上,此模糊性。它是一个setter调用还是一个局部变量赋值? Ruby通过选择局部变量赋值来解决这个问题。如果你想要的方法,要明确。

self.a = 123 

在另一种情况下,没有歧义。

4

看到类似a = 123,解释假定这始终是一个赋值操作。但是,您可以拨打self.a = 123 - 因为这不能作为适当的分配(变量名不能包含点);它会调用你定义的方法。

注意,同样的情况在类中,所以它不是一个不同的行为:

class Foo 
    def foo=(x) 
    puts "OK: x=#{x}" 
    end 

    def bar 
    foo = 1 
    end 

    def baz 
    self.foo = 1 
    end 
end 

调用bar不会打印您的信息,它只是执行任务。 baz将执行你的setter方法。