3.times {puts "Hello"}

输出:
你好
你好
你好
我们理解为timesInteger类中的函数,它以block作为参数。
我试着深入挖掘,发现事情并没有那么简单。
如果times是函数,而方法调用中的括号是可选的,我尝试使用以下方法验证它:
3.times({puts "Hello"})

它显然抛出了一个错误:
syntax error:(irb):3:语法错误,意外的字符串BEG,应为关键字do或{'或'('
3.次({打“你好”})
^
(irb):3:语法错误,意外的'}',应为输入结尾
3.次({打“你好”})
^
发件人/home/ashish/.rvm/rubies/ruby-2.0.0-p353/bin/irb:12:in`'
进一步调查:
a = 3.times
puts a.class

输出Enumerator这意味着3.times是一个Enumerator类对象。
有人能用确切的概念来解释这一切吗?

最佳答案

正如Sawa所说,块不是对象,因此不会作为参数传递块在Ruby中是一种特殊的东西它们有特殊的语法(只允许我们将一个块传递给一个方法)和专用于调用它们的特殊关键字下面是Ruby中times的一个实现示例:

def times
  if block_given?
    i = 0
    while i < self
      yield i
      i += 1
    end
    # times returns the number that was executing times,
    # so we need to return self here
    self
  else
    enum_for :times
    # ^^ This is where the Enumerator comes from if
    #    you don't pass a block.
  end
end

block_given?方法测试是否有与当前方法相关联的块,并且yield关键字调用该块。

关于ruby - 块作为 ruby 方法的参数是一个谜吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22385667/

10-16 04:10
查看更多