Skip to content

Instantly share code, notes, and snippets.

@arkadijs
Created February 20, 2014 10:43
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save arkadijs/9110991 to your computer and use it in GitHub Desktop.
Save arkadijs/9110991 to your computer and use it in GitHub Desktop.
How to write this nicely?
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"}
@FylmTM
Copy link

FylmTM commented Feb 20, 2014

opt = {}
opt[:config] = 1

data = { p1: 'x', p2: nil }
data.merge! p2: [{ r: 'const', t: opt[:config] }] if opt[:config]
p data
# {:p1=>"x", :p2=>[{:r=>"const", :t=>1}]}

opt.delete(:config)
data = { p1: 'x', p2: nil }
data.merge! p2: [{ r: 'const', t: opt[:config] }] if opt[:config]
p data
# {:p1=>"x", :p2=>nil}

data = {p1: 'x'}
data.merge! p2: [{ r: 'const', t: opt[:config] }] if opt[:config]
p data
# {:p1=>"x"}

В одной строчке все выглядит ужасно. Как видно - мерджим во всех трех случаях одно и тоже, разница только в исходных данных.

@FylmTM
Copy link

FylmTM commented Feb 20, 2014

Ии, как то так

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"}

@FylmTM
Copy link

FylmTM commented Feb 20, 2014

Можно добавить блоки.

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"}

@arkadijs
Copy link
Author

Спасибо.
Однако, последние два примера - нечитабельны и вносят новую сущность-костыль merge_data.
3-х строчный merge из первого комментария - ок, но это есть не более чем вариация на код оригинальной задачи.

Налицо трещина в "красивом" синтаксисе передачи именованых параметров через хэш таблицу, который (синтаксис) не выдержал проверку простой задачей. Референс на хэш можно передать и в Java.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment