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

如何分配Ruby var =返回值,而不是传入的值?

发布时间:2020-12-17 01:47:24 所属栏目:百科 来源:网络整理
导读:添加到存储在哈希表中的列表有一个很好的习惯用法: (hash[key] ||= []) new_value 现在,假设我编写了一个派生哈希类,就像在Hashie中找到的那样,它对我存储的任何哈希进行深度转换.然后我存储的内容不会是我传递给=运算符的同一个对象;散列可以转换为Mash或C
添加到存储在哈希表中的列表有一个很好的习惯用法:

(hash[key] ||= []) << new_value

现在,假设我编写了一个派生哈希类,就像在Hashie中找到的那样,它对我存储的任何哈希进行深度转换.然后我存储的内容不会是我传递给=运算符的同一个对象;散列可以转换为Mash或Clash,并且可以复制数组.

这是问题所在. Ruby显然从var =方法返回传入的值,而不是存储的值. var =方法返回什么并不重要.下面的代码演示了这一点:

class C
  attr_reader :foo
  def foo=(value)
    @foo = (value.is_a? Array) ? (value.clone) : value
  end
end

c=C.new
puts "assignment: #{(c.foo ||= []) << 5}"
puts "c.foo is #{c.foo}"
puts "assignment: #{(c.foo ||= []) << 6}"
puts "c.foo is #{c.foo}"

输出是

assignment: [5]
c.foo is []
assignment: [6]
c.foo is [6]

当我把这个作为一个错误发布给Hashie时,Danielle Sucher解释了发生了什么,并指出“foo.send:bar =,1”返回bar =方法返回的值. (研究的帽子提示!)所以我想我能做到:

c=C.new
puts "clunky assignment: #{(c.foo || c.send(:foo=,[])) << 5}"
puts "c.foo is #{c.foo}"
puts "assignment: #{(c.foo || c.send(:foo=,[])) << 6}"
puts "c.foo is #{c.foo}"

打印

clunky assignment: [5]
c.foo is [5]
assignment: [5,6]
c.foo is [5,6]

有没有更优雅的方式来做到这一点?

解决方法

c.foo ||= []  
c.foo << 5

使用两行代码并不是世界末日,而且更容易看到.

(编辑:李大同)

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

    推荐文章
      热点阅读