reverse_merge возвращает хеш вместо подкласса.Это ошибка или предназначен? - PullRequest
1 голос
/ 25 сентября 2019

Резюме: subclass.reverse_merge (class) возвращает класс - не подкласс

У меня есть небольшой класс, расширяющий Hash

class HtmlOptions < Hash
    def add_class 
    # add html-class like jQuery 
    …
    end

    (a little more)
end 

Так что, если я использую его таким образом с merge

input_options = HtmlOptions.new(…)
…
input_options.merge(id:"ovewrite_id").add_class("sample") 

работает должным образом, а при использовании reverse_merge

input_options = HtmlOptions.new(…)
input_options.reverse_merge(value:"default").add_class("sample")
#crashes

выдается ошибка (add_class undefined).

Хорошо, передача HtmlOptions обоим, делает трюк как:

input_options.reverse_merge(HtmlOptions.new(value:"default")).add_class("sample")

Так что теперь я думаю, что это ошибка, и исправление ее в моем классе HtmlOptions в порядке.Потому что я не могу придумать ситуацию, когда это тихое изменение класса предназначено.

С другой стороны, если основная идея reverse_merge - работать так строго reverse , я долженне меняйте его в моем классе (а взрывающая версия reverse_merge неверна)

Может кто-нибудь сказать мне, если я собирался использовать это поведение ?, (и, возможно, подскажите, где его использовать?) Или просто ошибка.

1 Ответ

1 голос
/ 25 сентября 2019

reverse_merge - это как раз то, что сказано: обратное слияние.Исходный код для него:

def reverse_merge(other_hash)
  other_hash.merge(self)
end

Поэтому результатом является класс объекта, который вы передаете, а не объект, который вы вызываетеэто с.

Я думаю, что лучшим вариантом было бы переопределить reverse_merge для вашего HtmlOptions класса;как то так:

def reverse_merge(other_hash)
  new(super)
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...