アキュムレータを使用する場合、アキュムレータはreduce
ブロック内にのみ存在するのでしょうか、それとも関数内に存在しますか?Rubyでreduce/injectを使用する方法未定義変数
私はのように見える方法があります。
def my_useless_function(str)
crazy_letters = ['a','s','d','f','g','h']
str.split.reduce([]) do |new_array, letter|
for a in 0..crazy_letters.length-1
if letter == crazy_letters[a]
new_array << letter
end
end
end
return true if (new_array == new_array.sort)
end
私はこのコードを実行すると、私はエラー
"undefined variable new_array in line 11 (the return statement)"
を取得し、私はまた、内部else
文として別の変数にnew_array
値を代入しようとしたが私のreduce
ブロックしかし、それは私に同じ結果を与えた。
なぜこのようなことが起こっているのか説明できますか?
ニースが、私はより効率的なバージョンを書くことを約ありましたそれはあなたのものに非常によく似ていました。配列がソートされているかどうかをチェックするには、ソートする必要はありません(例えば、 'each_cons'を代わりに使うことができます)。 –
@Eric、Rubyでは' class Array; def sorted?:enum = self.to_enum;ループ{return false if(enum.next <=> enum.peek)== 1};真;終わり;終わり; [1,2,3]。 #=> true; [1,3,2]。 #=> false'(または、あなたが示唆したように 'each_cons'を使用します)。 –
@CarySwoveland: 'Array#sorted? 'は、基本ループを持つC関数の完璧な候補になります。 –