如何编写更好的代码来传递键值参数?

时间:2012-05-03 16:28:28

标签: ruby coding-style

我想以类似Ruby的方式编写Ruby代码,并在处理参数传递时遇到问题。

我必须看看ABC是否为零。如果ABC为nil,我会将另一个符号传递给dosomething,否则我会传递另一种类型的哈希值来计算。

由于Ruby不像Java,它可以传递不同类型的参数(不同的键)。

如何让以下代码更美观?

do_manythingdo_otherthingsdo_manythings_again合并到一个函数中并不是我的答案,因为我会在我的代码中的许多地方调用dosomething

if ABC.nil?
Apple.dosomething (:foo => DEF) { |a| 
     a.do_manything
     a.do_otherthings
     a.do_manythings_again  
}
else
Apple.dosomething (:bar => ABC) { |a| 
     a.do_manything
     a.do_otherthings
     a.do_manythings_again  
}
end

3 个答案:

答案 0 :(得分:3)

使用三元运算符。

Apple.dosomething (ABC.nil? ? {foo:DEF} : {bar:ABC}) do |a|
  a.do_manything
  a.do_otherthings
  a.do_manythings_again
end

这是格式 condition ? return_if_true : return_if_false

答案 1 :(得分:2)

您可以切换发送的哈希值:

opts = ABC.nil? ? {foo:DEF} : {bar:ABC}
Apple.dosomething(opts) do |a|
  do_many_things
  do_other_things
  do_many_things_again
end

...或者你可以传递一个lambda作为块:

stuff_to_do = ->(a) do
  do_many_things
  do_other_things
  do_many_things_again
end

if ABC.nil?
  Apple.dosomething(foo:DEF,&stuff_to_do)
else
  Apple.dosomething(bar:ABC,&stuff_to_do)
end

答案 2 :(得分:0)

你可以这样做:

options = if ABC.nil? then { foo: DEF } else { bar: ABC } end

Apple.do_something options do |apple| 
  apple.instance_eval do
    do_many_things
    do_other_things
    do_many_things_again
  end
end

按照惯例,名称和标识符中的单词以下划线(_)分隔,do / end用于多行块。

另外,我相信这个问题属于Code Review