*, & 参数前缀

we specified the arguments as *args, meaning “collect the actual parameters passed to the method into an array named args.”

比如:
def some_method(arg1, arg2, *args)
  ...
end
调用some_method(1,2,3,4,5)相当于some_method(1,2,[3,4,5])

例1:
class File
  def self.open_and_process(*args)
  f = File.open(*args)
  yield f
  f.close()
  end
end
File.open_and_process("testfile", "r") do |file|
  while line = file.gets
    puts line
  end
end

produces:
This is line one
This is line two
This is line three
And so on...

例2
class File
  def self.my_open(*args)
    result = file = File.new(*args)
    # If there's a block, pass in the file and close
    # the file when it returns
    if block_given?
      result = yield file
      file.close
    end
    return result
  end
end

**************************************

Remember I said that you can think of blocks as being a little like an implicit parameter that's passed to a method? Well, you can also make that parameter explicit. If the last parameter in a method definition is prefixed with an ampersand (such as &action), Ruby looks for a code block whenever that method is called. That code block is converted to an object of class Proc and assigned to the parameter. You can then treat the parameter as any other varible.

class ProcExample
  def pass_in_block(&action)
     @stored_proc = action
  end
  def use_proc(parameter)
    @stored_proc.call(parameter)
  end
end
eg = ProcExample.new
eg.pass_in_block { |param| puts "The parameter is #{param}" }
eg.use_proc(99)
produces:
The parameter is 99



<Programming ruby 1.9>P65-66

你可能感兴趣的:(F#,Ruby)