Ruby中的块和产量

我试图理解块和产生以及它们在Ruby中的工作方式

如何使用yield?我看过的许多Rails应用程序都以一种奇怪的方式使用产生

有人能给我解释一下或者告诉我去哪里理解他们吗

是的,一开始有点令人费解

在Ruby中,方法可以接收代码块以执行任意代码段

当一个方法需要一个块时,可以通过调用yield函数来调用它

例如:

Person为例,这是一个具有name属性和do\u with\u name方法的类。调用该方法时,它将name属性传递给块

班级人员
def初始化(名称)
@name=name
终止
def do_with_name#需要一个块
yield(@name)#调用块并传递`@name`属性
终止
终止

现在可以调用此方法并传递任意代码块

person=person.new(“奥斯卡”)
#调用传递块的方法以打印值
person.do_与_name do| value|
把「;Got:#{value}"
终止

将打印:

获得奥斯卡奖

请注意,该块接收一个名为value的变量作为参数。当代码调用yield时,它将@name的值作为参数传递

收益率(@name)

可以使用不同的块调用相同的方法

例如,要反转名称:

颠倒的名称=”&引用;
#调用传递不同块的方法
person.do_与_name do|value|
已反转\u name=value.reverse
终止
把你的名字倒过来
=&gt&引用;racsO“;

其他更有趣的现实生活示例:

数组中的筛选器元素:

days=[“星期一”、“星期二”、“星期三”、“星期四”、“星期五”]
#选择那些以“T”开头的
天。选择做|项|
item.match/^T/
终止
=>[“星期二”、“星期四”]

或按名称长度排序:

days.sort do | x,y|
x、 大小&lt=&燃气轮机;y、 大小
终止
=>[“星期一”、“星期五”、“星期二”、“星期四”、“星期三”]

如果块是可选的,则可以使用:

如果给定块,产量(值)?

如果不是可选的,就调用它

您可以使用irb(交互式Ruby Shell)在计算机上尝试这些示例

以下是复制/粘贴就绪表单中的所有示例:

班级人员
def初始化(名称)
@name=name
终止
def do_with_name#需要一个块
yield(@name)#调用块并传递`@name`属性
终止
终止
person=person.new(“奥斯卡”)
#调用传递块的方法以打印值
person.do_与_name do| value|
把「;Got:#{value}"
终止
颠倒的“U名称=”&引用;
#调用传递不同块的方法
person.do_与_name do|value|
已反转\u name=value.reverse
终止
把你的名字倒过来
#数组中的筛选器元素:
天数=[“星期一”、“星期二”、“星期三”、“星期四”、“星期五”]
#选择那些以“T”开头的
天。选择做|项|
item.match/^T/
终止
#按名称长度排序:
days.sort do | x,y|
x、 大小&lt=&燃气轮机;y、 大小
终止

发表评论