0

我想以更像 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
4

3 回答 3

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

于 2012-05-03T16:51:22.257 回答
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
于 2012-05-03T17:04:17.250 回答
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

于 2012-05-03T16:51:07.117 回答