【问题标题】:Splat parameters behave differently for attribute writers compared to regular method与常规方法相比,属性写入器的 Splat 参数行为不同
【发布时间】:2018-02-17 09:22:13
【问题描述】:

我有以下两种方法,我认为不管它们的名字,它们应该具有相同的行为:

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

为什么他们的行为不一样?

编辑:忘记用self. 将上述内容包装在一个类/调用中,这会意外产生相同的行为,但原因不同。答案中已经指出。

【问题讨论】:

  • 我回滚了您的编辑,因为您在获得 mudasobwa 的答案后更改了问题,该答案关键地指出了与您更改的部分相关的内容。不要在那个时候改变你的问题。
  • 抱歉,忘记添加self.,而我试图提供一个可以重现问题的最小示例,因为它意外地仍然产生了相同的问题。不幸的是,这个问题很愚蠢,但最后我确实在你所指的答案中得到了我真正问题的答案。

标签: ruby splat


【解决方案1】:

事情是这样的

a = 1

设置局部变量并且根本不调用你的方法。试试

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

var= 方法需要明确的接收者。要调用您的方法,请使用显式接收器调用它:

self.a = 1

仍然除了1之外不会返回任何东西,因为赋值方法返回值(与通过MyClass.new调用的initialize相同的方式返回一个实例,无论如何。)但您可能会检查 splat 是否适用于:

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

【讨论】:

  • 啊是的,splat 最肯定有效,即使它看起来没有 :)
  • 忘记添加self.,而我试图提供一个可以重现问题的最小示例,因为它意外地仍然产生了相同的问题。所以带走的是“赋值方法返回值,无论如何”。谢谢!
【解决方案2】:

这与 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]

【讨论】:

  • 赞成.send 'a=', 1 # => [1] 我不知道。
猜你喜欢
  • 2014-07-19
  • 1970-01-01
  • 2020-06-14
  • 1970-01-01
  • 2023-04-10
  • 1970-01-01
  • 1970-01-01
  • 2013-10-07
  • 2015-08-02
相关资源
最近更新 更多