为什么Ruby使用收益?

我是 Ruby的新手.我使用了很多C#和 JavaScript,它允许高阶函数,我通常每天使用它们.

Ruby似乎对我来说有点奇怪.每个功能可能如下所示:

def each
    @items.each do |item|
        yield(item)
    end
end

items.each { |item| puts item }

然而,Ruby还对高阶功能有一些支持.以上可以重写为:

def each(proc)
    @items.each do |item|
        proc.call item
    end
end

items.each -> (item) { puts item }        # Or...
items.each lambda { |item| puts item }

甚至:

def each(&proc)
    @items.each do |item|
        proc.call item
    end
end

# No difference in Syntax.
items.each { |item| puts item }

哪个更符合大多数其他语言,只有几个字符更长.而不是明确地传递一个块,一切似乎都使用yield.

屈服本身似乎是疯狂,神奇和神秘.毕竟,它将到达呼叫的起点,并在呼叫之后立即抓取一个块.这似乎是奇怪和不自然的,我不知道这个功能在另一种语言的任何并行.

那么收益是多少呢?

解决方法

产量将对象传递给方法的块

[Yield is] going to the origin of the call and grabbing a block immediately following the call.

不是真的. yield将一个参数传递给块;它不会“抓块”或做任何事情.换句话说,这个:

def foo; yield self; end
foo { |x| x.inspect }                                       
# => "main"

在这里,yield只是将参数传递给传递给foo方法的块.每个Ruby方法支持一个可选的块 – 除非块实际上是必需的 – 所以唯一的“魔术”就是语言允许一个块被传递,即使没有被明确声明为方法签名的一部分.

其他例子

要查看此隐含签名的行为,请考虑:

def foo; puts block_given?; end
foo { |x| x.inspect }

这将打印“true”并返回nil,这是puts方法的预期返回值.

当然,没有收益,块根本不做任何事情.例如:

def foo; end
foo { |x| x.inspect }
# => nil

相关文章

validates:conclusion,:presence=>true,:inclusion=>{...
一、redis集群搭建redis3.0以前,提供了Sentinel工具来监控各...
分享一下我老师大神的人工智能教程。零基础!通俗易懂!风趣...
上一篇博文 ruby传参之引用类型 里边定义了一个方法名 mo...
一编程与编程语言 什么是编程语言? 能够被计算机所识别的表...
Ruby类和对象Ruby是一种完美的面向对象编程语言。面向对象编...