イテレータかのようにRubyのメソッドの収率は、コンテキストに応じて配列を返すことはできますか?

StackOverflow https://stackoverflow.com/questions/1050430

質問

私はそれがブロックに渡すことができるように複数の値が得られるルビーの任意の方法を持っています

def arbitrary
  yield 1
  yield 2
  yield 3
  yield 4
end

arbitrary { |x| puts x }

私はブロックがない場合は、それだけで配列として値を返し、そのように、この方法を変更したいと思います。したがって、この構築物は同様に動作します。

myarray = arbitrary
p a -----> [1, 2, 3, 4, 5]

Rubyで、このことは可能ですか?

役に立ちましたか?

解決

そのための構文があります

def arbitrary(&block)
  values = [1, 2, 3, 4]
  if block
    values.each do |v|
      yield v
    end
  else
    values
  end
end

注:

yield v

に置き換えることができます:

block.call v

他のヒント

def arbitrary
  values = [1,2,3,4]
  return values unless block_given? 
  values.each { |val| yield(val) }
end
arbitrary { |x| puts x }
arbitrary

ルビーでは、あなたはそれを実装するために列挙子を使用することができ1.9+。

def arbitrary(&block)
  Enumerator.new do |y|
    values = [1,2,3,4]
    values.each { |val| y.yield(val) }
  end.each(&block)
end

それはあまりにも無限のストリームのために働くという利点があります:

# block-only version
#
def natural_numbers
  0.upto(1/0.0) { |x| yield x }
end

# returning an enumerator when no block is given
#
def natural_numbers(&block)
  Enumerator.new do |y|
    0.upto(1/0.0) { |x| y.yield(x) }
  end.each(&block)
end

しかし、それを行うための最も慣用的な方法は、= <のhref =「http://ruby-doc.org/core-2.2.1/Object.html#method-i-to_enum」のrelであなたの方法を守るためにあります"noreferrer"> to_enum(your_method_name, your_args) のそうのような:

def arbitrary
  return to_enum(:arbitrary) unless block_given?

  yield 1
  yield 2
  yield 3
  yield 4
end

これはRubyのコア自体は複数の場所で使用するライブラリイディオムです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top