gpt4 book ai didi

ruby - 为 setter 方法指定默认值

转载 作者:数据小太阳 更新时间:2023-10-29 07:14:16 24 4
gpt4 key购买 nike

考虑以下代码:

class Dummy
def attr=(arg = 10)
@attr = arg
end
def attr2=(arg = 20)
@attr2 = 20
end
end;
d = Dummy.new; d.attr=(); d.attr2=(); d
=> #<Dummy:0x007f8d6430e2a8 @attr=nil, @attr2=20>

attr= 方法似乎丢弃了默认参数值并将 nil 分配给实例变量,但在 attr2= 中分配显式值有效 方法。为什么会这样?

编辑:

我应该用更清楚的方式表达自己。显式赋值显然适用于 attr2= 方法。这只留下一个解释——setter 方法丢弃默认参数值。为什么会发生这种丢弃?

最佳答案

= 结尾的方法不是普通方法,因为它们被 ruby​​ 解释器识别为 setter,因此具有语法糖:

d.attr = 4

当您调用 d.attr=() 时,您实际上是在调用 d.attr=(())() 在 ruby​​ 中返回 nil:

()
# => nil

Ruby 解释器不会让你在没有任何参数的情况下逃脱,因为如果你完全放弃 (),ruby 只会将下一行的结果作为参数,或者抛出一个 语法错误 如果您尝试使用 ;

换行
d.attr=
5
# => 5

d.attr=;
# => syntax error, unexpected ';'

要查看工作中的默认参数,您可以使用send:

d.send(:attr=)
# => 10
d
# => #<Dummy:0x007f8d6430e2a8 @attr=10, @attr2=20>

关于ruby - 为 setter 方法指定默认值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27552909/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com