我试图理解块和产生以及它们在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
终止
把你的名字倒过来
=>&引用;racsO“;
其他更有趣的现实生活示例:
数组中的筛选器元素:
days=[“星期一”、“星期二”、“星期三”、“星期四”、“星期五”]
#选择那些以“T”开头的
天。选择做|项|
item.match/^T/
终止
=>;[“星期二”、“星期四”]
或按名称长度排序:
days.sort do | x,y|
x、 大小<=&燃气轮机;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、 大小<=&燃气轮机;y、 大小
终止