我想以类似Ruby的方式编写Ruby代码,并在处理参数传递时遇到问题。
我必须看看ABC
是否为零。如果ABC
为nil,我会将另一个符号传递给dosomething
,否则我会传递另一种类型的哈希值来计算。
由于Ruby不像Java,它可以传递不同类型的参数(不同的键)。
如何让以下代码更美观?
将do_manything
,do_otherthings
,do_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
答案 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。