加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby – 指定setter方法的默认值

发布时间:2020-12-17 03:32:28 所属栏目:百科 来源:网络整理
导读:请考虑以下代码: class Dummy def attr=(arg = 10) @attr = arg end def attr2=(arg = 20) @attr2 = 20 endend;d = Dummy.new; d.attr=(); d.attr2=(); d= #Dummy:0x007f8d6430e2a8 @attr=nil,@attr2=20 似乎attr =方法丢弃了默认参数值并且无论如何都将nil
请考虑以下代码:

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>

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读