Ruby on rails 反向合并返回哈希而不是子类。这是一个Bug还是故意的?
小结:子类。反向合并(类)返回类-而不是子类 我有一个扩展Ruby on rails 反向合并返回哈希而不是子类。这是一个Bug还是故意的?,ruby-on-rails,Ruby On Rails,小结:子类。反向合并(类)返回类-而不是子类 我有一个扩展Hash class HtmlOptions < Hash def add_class # add html-class like jQuery … end (a little more) end 使用反向\u合并 input_options = HtmlOptions.new(…) … input_options.merge(id:"ovewrite_id").add_class(
Hash
class HtmlOptions < Hash
def add_class
# add html-class like jQuery
…
end
(a little more)
end
使用反向\u合并
input_options = HtmlOptions.new(…)
…
input_options.merge(id:"ovewrite_id").add_class("sample")
input_options = HtmlOptions.new(…)
input_options.reverse_merge(value:"default").add_class("sample")
#crashes
抛出错误(添加未定义的类)
好的,将HtmlOptions
传递给这两个选项,技巧如下:
input_options.reverse_merge(HtmlOptions.new(value:"default")).add_class("sample")
所以现在我认为这是一个bug,在我的HtmlOptions
类中纠正它是可以的。因为我想不出这种无声的课堂变革是为了什么
另一方面,如果反向合并的基本思想是严格反向工作,我不应该在我的类中更改它(反向合并的bang版本是错误的)
有人能告诉我我是否有意这样做吗?,(也许能告诉我在哪里使用它?)
或者只是一个bug。反向合并就是它所说的:反向合并。其主要原因是:
def反向合并(其他散列)
其他_散列合并(自身)
结束
这就是为什么结果是您传入的对象的类,而不是您调用它的对象
我认为最好的选择是为您的HtmlOptions
类重写reverse\u merge
;大概是这样的:
def反向合并(其他散列)
新(超级)
结束
当前提供的reverse\u merge
版本实际上没有将other\u hash
的内容合并到self
中。我会用merge(other_hash){| key,oldval,_newval | old_val}覆盖reverse_merge