Первый
[1] pry(main)> 1.month.from_now.change(%i(min sec).inject({}){|h, i| h.merge(i => Time.current.send(i))}.merge(hour: 10))
=> Sat, 03 Aug 2019 10:25:00 KST +09:00
Второй
[2] pry(main)> 1.month.from_now.change(min: Time.current.min, sec: Time.current.sec, hour: 10)
=> Sat, 03 Aug 2019 10:26:31 KST +09:00
Какой код более читабелен?
Я думаю, что первый код менее прост для чтения.
Первый код может быть разделен на две части.
1.month.from_now.change
- https://api.rubyonrails.org/classes/Time.html#method-i-change
[3] pry(main)> %i(min sec).inject({}){ |h, i| # https://apidock.com/ruby/Enumerable/inject
[3] pry(main)* h.merge(i => Time.current.send(i)) # https://apidock.com/ruby/Object/send
[3] pry(main)* }.merge(hour: 10)
=> {:min=>34, :sec=>48, :hour=>10}
Так что, когда кто-то, кто не знаком с ruby, читает первый код, это немного сложно.
Кстати, если кто-то знает метод Time.change
, второй код проще.
Разница в том, что первый код менее повторяется, чем второй.
- Time.current
- мин
- сек
Первый код используется только один раз над ключевым словом. Поэтому в первом коде используется дополнительный метод inject
и метод merge
, а также дополнительная сложность.
Какой я использую код?