Rubyには、繰り返し実行してその結果を直接返す素晴らしい方法があります。これには主に配列メソッドが含まれます。たとえば:whileループを使用してRuby配列を作成する最もクリーンな方法は何ですか?
def ten_times_tables
(1..5).map { |i| i * 10 }
end
ten_times_tables # => [10, 20, 30, 40, 50]
はしかし、私は時々while
を使用して反復処理し、直接結果の配列を返すようにしたいです。例えば、アレイの内容は、期待される最終値または一部のアキュムレータ、または当社の制御外の条件であってもよい。
A(不自然)の例のようになります。私には
def fibonacci_up_to(max_number)
sequence = [1, 1]
while sequence.last < max_number
sequence << sequence[-2..-1].reduce(:+)
end
sequence
end
fibonacci_up_to(5) # => [1, 1, 2, 3, 5]
、この種のアプローチは非常に「非ルビー」を感じています。私が構築し、名前を付け、後で配列を返すという事実は、アンチパターンのように感じます。これまでのところ、私が思い付くことができる最高はtap
を使用しているが、それはまだ非常に不快な(そして非常ネストされた)感じている:
def fibonacci_up_to(max_number)
[1, 1].tap do |sequence|
while sequence.last < max_number
sequence << sequence[-2..-1].reduce(:+)
end
end
end
誰がこの種の問題への賢い解決策を持っていますか? (多分あなたの不自然な例は、あなたの実際の使用の場合よりも、この多くの方にフィットしますが)あなたはこのような状況のために見たいと思うかもしれません
あなたの人為的なシナリオは、あなたの言うとおり、非常に珍しいです。したがって、結果を達成するためのコードは少し珍しいように見えます。しかし、私はあなたの元のアプローチやそれを改善するための重要な方法について特に間違ったものは見当たりません。 –