Created
February 20, 2014 10:43
-
-
Save arkadijs/9110991 to your computer and use it in GitHub Desktop.
How to write this nicely?
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
def f(params) | |
puts params | |
end | |
opt = {} | |
opt[:config] = 1 | |
f (:p1 => 'x', :p2 => ( [{ :r => 'const', :t => opt[:config] }] if opt[:config] )) | |
# {:p1=>"x", :p2=>[{:r=>"const", :t=>1}]} | |
opt.delete(:config) | |
f (:p1 => 'x', :p2 => ( [{ :r => 'const', :t => opt[:config] }] if opt[:config] )) | |
# {:p1=>"x", :p2=>nil} | |
f ({ :p1 => 'x' }.merge( opt[:config] ? { :p2 => [{ :r => 'const', :t => opt[:config] }] } : {} )) | |
# {:p1=>"x"} |
Ии, как то так
def merge_data(data, opt = {}, data_to_merge = {p2: [{ r: 'const', t: opt[:config] }]})
data.merge! data_to_merge if opt[:config]
data
end
p merge_data({ p1: 'x', p2: nil }, {config: 1})
# {:p1=>"x", :p2=>[{:r=>"const", :t=>1}]}
p merge_data({ p1: 'x', p2: nil })
# {:p1=>"x", :p2=>nil}
p merge_data({ p1: 'x'})
# {:p1=>"x"}
Можно добавить блоки.
def merge_data(data, opt = {})
data.merge! yield(opt) if opt[:config]
data
end
p merge_data({ p1: 'x', p2: nil }, {config: 1}) { |opt| {p2: [{ r: 'const', t: opt[:config] }]} }
# {:p1=>"x", :p2=>[{:r=>"const", :t=>1}]}
p merge_data({ p1: 'x', p2: nil }) { |opt| {p2: [{ r: 'const', t: opt[:config] }]} }
# {:p1=>"x", :p2=>nil}
p merge_data({ p1: 'x'}) { |opt| {p2: [{ r: 'const', t: opt[:config] }]} }
# {:p1=>"x"}
Спасибо.
Однако, последние два примера - нечитабельны и вносят новую сущность-костыль merge_data.
3-х строчный merge из первого комментария - ок, но это есть не более чем вариация на код оригинальной задачи.
Налицо трещина в "красивом" синтаксисе передачи именованых параметров через хэш таблицу, который (синтаксис) не выдержал проверку простой задачей. Референс на хэш можно передать и в Java.
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
В одной строчке все выглядит ужасно. Как видно - мерджим во всех трех случаях одно и тоже, разница только в исходных данных.