2017-09-08 22 views
0

我有以下两种方法,我认为应该有相同的行为无视他们的名字:啪参数表现不同的属性的作家相比,常规方法

def a=(*params) 
    params 
end 

def b(*params) 
    params 
end 

但当其实我使用它们:

a=(1) # => 1 
b(1) # => [1] 
(a=1) == b(1) # => false 

,而有趣的是:

(a=1,2) == b(1,2) # => true 

为什么不是他们的行为SA我?

编辑:忘了包裹上面结合self.类/调用,它意外地产生相同的行为,但对于不同的原因。答案中已经指出。

+2

我回滚了你的编辑,因为你在从mudasobwa得到一个答案之后改变了问题,这个答案至关重要地指出了与你改变的部分有关的东西。在那个时候不要改变你的问题。 – sawa

+0

对不起,忘了加上'self.'而我是想提供一个最小的例子,因为它无意中仍产生同样的问题,这个问题可以重现。遗憾的是这样的问题是愚蠢的,但最终我没有得到你指的是答案的答案,我的真正的问题。 – thisismydesign

回答

4

它与splat无关。这是分配操作员。在ruby中,赋值运算符返回分配的值。该方法的返回值被忽略。

所以a=1返回1而不是[1]

但是,正如@mudasobwa提到的,你都不在调用此方法。但是,如果你是,那会发生什么(忽略返回值)。

class Foo 

    def a=(*params) 
    params 
    end 

end 

f = Foo.new 

f.a = 1 # => 1 
f.a = 1,2 # => [1, 2] 

为了不忽略返回值,请在不使用赋值运算符的情况下调用该setter。

f.send 'a=', 1 # => [1] 
+0

Upvoted for'.send'a =',1#=> [1]'我不知道。 – mudasobwa

2

的事情是,

a = 1 

设置局部变量,完全不打电话给你的方法。试着用

def a=(*param) 
    puts "I AM HERE" 
end 

var=方法需要一个明确的接收器。打电话给你的方法,有一个明确的接收器调用它:

self.a = 1 

仍然不会返回任何东西,但1,因为分配方法返回的值(方式initialize通过MyClass.new返回一个实例调用相同,无论如何)。但是你可能会检查splat的工作原理:

def a=(*param) 
    puts param.inspect 
end 
self.a = 1 
# [1] 
#⇒ 1 
+0

是啊,图示肯定的作品,即使它看起来不:) –

+0

忘了加上'self.'而我是想提供一个最小的例子,因为一不小心它仍然产生同样的问题可以重现问题。因此,拿走是“分配方法返回价值,不管是什么”。谢谢! – thisismydesign

相关问题