3.times {puts "Hello"}
输出:
你好
你好
你好
我们理解为
times
是Integer
类中的函数,它以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/