如何分配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 使用两行代码并不是世界末日,而且更容易看到. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- xml – 如何覆盖父/扩展元素中的Xsd元素
- c# – AutoMapper将未映射的属性映射到Dictionary / Extens
- ruby-on-rails – Ember-data和MongoDB,如何处理_id
- 2013 duilib入门简明教程 -- XML配置界面(6)
- c# – 如何获取WPF应用程序的发布版本
- vue-cli 使用axios的操作方法及整合axios的多种方法
- ruby-on-rails – 在开发中改变了我的数据库结构,因此尝试重
- Actionscript 3 vs haXe:为新的Flash项目选择哪个?
- C#隐式运算符和ToString()
- 从内存卡读取xml文件到内存,写入xml到sd卡