0

よりRubyに似たスタイルでRubyのコードを記述したいのですが、引数の受け渡しを操作するときに問題が発生しました。

ABCゼロかどうかを確認する必要があります。ABCがnilの場合は、別のシンボルをdosomethingに渡します。そうでない場合は、別のタイプのハッシュ値を渡して計算します。

RubyはJavaとは異なり、異なるタイプの引数(異なるキー)を渡すことができます。

次のコードをより美しくするにはどうすればよいですか?

コード内の多くの場所で呼び出すためdo_manything、、、を1つの関数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

...または、ラムダをブロックとして渡すことができます:

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は複数行のブロックに使用されます。

また、この質問はコードレビューに属していると思います。

于 2012-05-03T16:51:07.117 に答える