1

マップを使用してこのメ​​ソッドをリファクタリングする方法はありますか? (このメソッドの意図は、1 から max パラメータまでの素数の配列を返すことです)

def primes(max)
  prime_arr = []
   (1..max).each {|i| prime_arr << i if is_prime?(i)}
  prime_arr
end

is_prime?(val) は true または false を返します。

メソッドを次のように変更した場合:

def primes(max)
 (1..max).map {|i| i if is_prime?(i)}
end

コード ブロックが失敗した場合、返される配列には nil 値が含まれます。

p primes(5)
#=> [1, 2, 3, nil, 5]

私は自分が持っているものを知っていますが、配列を宣言せず、より良い方法がある場合は配列を具体的に返したいと思います

4

3 に答える 3

2

Enumerable.reject(または) は、シーケンスをフィルター処理Enumerable.selectするための正しい方法です。

これらのフィルターメソッドは、戻り値の真偽のみを確認するためiこの場合は (常に真の値であるため) "動作" をi返しますが、戻り値は( とは異なり) 実際には破棄mapされるため、述語は次のようになります。

c.reject {|i| !is_prime?(i)}

# or (inverting the double negative)
c.select {|i| is_prime?(i)}

# or (with &:)
c.select(&:is_prime?)

(&:後者のケースの背後にある魔法については、 を参照してください。)

また、これは素数を見つけることを扱っているので、エラトステネスのふるいが良い読み物かもしれません.

于 2013-10-31T20:11:48.237 に答える
1
require 'Prime'
MAX = 100
p Prime.each(MAX).to_a      #=> [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31...
p (1..MAX).select(&:prime?) #=> [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31...

選択して変換する場合は、 grepを使用することもできます。

primes = ->x{x.prime?} # (new lambda syntax)
p (1..100).grep(primes){|x| x.to_s} #=> ["2", "3", "5", "7", "11", "13", "17",...
于 2013-10-31T20:30:38.687 に答える
0

ええ...説明しようとしている間に方法を見つけましたが、お気軽にもっと良い方法を教えてください!

def primes(max)
  (1..max).reject {|i| i if ! is_prime?(i)}
end
于 2013-10-31T20:05:02.823 に答える