views:

270

answers:

2

I have an arbitrary method in Ruby that yields multiple values so it can be handed to a block:

def arbitrary
  yield 1
  yield 2
  yield 3
  yield 4
end

arbitrary { |x| puts x }

I'd like to modify this method so that, if there is no block, it just returns the values as an array. So this construct would work as well:

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

Is this possible in Ruby?

+7  A: 

There is a syntax for that:

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

Note:

yield v

Can be replaced with:

block.call v
bltxd
Perfect, thank you.
sh-beta
molf
@Molf: You're absolutely right.
bltxd
+8  A: 
def arbitrary
  values = [1,2,3,4]
  return values unless block_given? 
  values.each { |val| yield(val) }
end
arbitrary { |x| puts x }
arbitrary
Subba Rao
Also works, chose blue.tuxedo's since he was first.
sh-beta
+1: cleaner, crisper, and easier to follow
Brent.Longborough