Ruby中的管道符号是什么?
我正在学习Ruby和RoR,它们来自PHP和Java背景,但是我不断遇到这样的代码:
def new
@post = Post.new
respond_to do |format|
format.html # new.html.erb
format.xml { render :xml => @post }
end
end
在|format|
做什么?这些管道符号在PHP / Java中的等效语法是什么?
Answers:
它们是产生给块的变量。
def this_method_takes_a_block
yield(5)
end
this_method_takes_a_block do |num|
puts num
end
输出“ 5”。一个更神秘的例子:
def this_silly_method_too(num)
yield(num + 5)
end
this_silly_method_too(3) do |wtf|
puts wtf + 1
end
输出为“ 9”。
一开始这对我来说也很奇怪,但是我希望这个解释/ walkthru能对您有所帮助。
该文档以一种很好的方式触及了这个主题-如果我的回答没有帮助,我相信他们的指南会有用。
首先,通过键入irb
shell并点击来启动Interactive Ruby解释器Enter。
输入类似:
the_numbers = ['ett','tva','tre','fyra','fem'] # congratulations! You now know how to count to five in Swedish.
只是为了让我们有一个数组可以玩。然后我们创建循环:
the_numbers.each do |linustorvalds|
puts linustorvalds
end
它将输出所有数字,并用换行符分隔。
在其他语言中,您必须编写如下内容:
for (i = 0; i < the_numbers.length; i++) {
linustorvalds = the_numbers[i]
print linustorvalds;
}
要注意的重要事项是,|thing_inside_the_pipes|
只要您一直使用它,它就可以是任何东西。并且了解到我们正在谈论的是循环,直到后来我才意识到这一点。
for linustorvalds in the_numbers do print linustorvalds
。也许更直观。
@names.each do |name|
puts "Hello #{name}!"
end
在http://www.ruby-lang.org/en/documentation/quickstart/4/伴随着这样的解释:
each
是接受一个代码块然后运行的代码用于在列表中的每个元素块的方法,和之间的位do
和end
就是这样一个块。块就像一个匿名函数或lambda
。管道字符之间的变量是此块的参数。此处发生的是,对于列表中的每个条目,
name
都绑定到该列表元素,然后puts "Hello #{name}!"
使用该名称运行表达式。
Java中的等效内容将类似于
// Prior definitions
interface RespondToHandler
{
public void doFormatting(FormatThingummy format);
}
void respondTo(RespondToHandler)
{
// ...
}
// Equivalent of your quoted code
respondTo(new RespondToHandler(){
public void doFormatting(FormatThingummy format)
{
format.html();
format.xml();
}
});
如果需要,使其更加清晰:
管道棒本质上是一个新变量,用于保存从方法调用之前生成的值。类似于:
方法的原始定义:
def example_method_a(argumentPassedIn)
yield(argumentPassedIn + 200)
end
使用方法:
example_method_a(100) do |newVariable|
puts newVariable;
end
几乎与编写此代码相同:
newVariable = example_method_a(100)
puts newVariable
在这里,newVariable = 200 + 100 = 300:D!
wtf
当去|wtf|
块结束?