我是Ruby的初学者,所以很抱歉问这么简单的问题,但是这段代码有什么问题吗?
3.upto(9) {
print "Hello"
puts " World"
}
或
3.upto(9) { |n|
print "Hello "
puts n
}
它工作得很好,但我看到的大多数代码示例都使用
3.upto(9) do |n|
print "Hello "
puts n
end
只对单个语句使用大括号是不是一种惯例?来自C/C#的第一个对我来说似乎更自然,但是在罗马的时候!
发布于 2010-09-10 04:13:44
这两种语法之间有细微的差别。{ }
比do ... end
具有更高优先级。因此,下面的代码将把bar
和一个块传递给foo
方法
foo bar do ... end
而下面的代码会将一个块传递给bar
,并将结果传递给foo
foo bar { ... }
因此,您的示例将执行相同的操作。但是,如果您去掉了括号:
> 3.upto 9 {
puts "Hi"
}
SyntaxError: compile error
(irb):82: syntax error, unexpected '{', expecting $end
3.upto 9 {
^
from (irb):82
from :0
> 3.upto 9 do
puts "Hi"
end
Hi
Hi
Hi
Hi
Hi
Hi
Hi
=> 3
因此,如果您在Ruby语言中去掉括号,{ }
更有可能赶上您,这是相当常见的;出于这个原因,并且由于Ruby和其他控制构造都使用end
作为分隔符,人们通常将do ... end
用于语句末尾的多行代码块。
但是,{ }
经常用于do ... end
比较麻烦地方,例如,如果您要将接受块的几个方法链接在一起。这可以让您编写简短的、一行的小块,这些块可以用作方法链的一部分。
> [1,2,3].sort{|x,y| y<=>x}.map{|x| x+1}
=> [4, 3, 2]
这里有一个例子来说明这一区别:
def foo arg
if block_given?
puts "Block given to foo"
yield arg
else
puts "No block given to foo"
arg
end
end
def bar
if block_given?
puts "Block given to bar"
yield "Yielded from bar"
else
puts "No block given to bar"
end
"Returned from bar"
end
irb(main):077:0> foo bar { |arg| puts arg }
Block given to bar
Yielded from bar
No block given to foo
=> "Returned from bar"
irb(main):078:0> foo bar do |arg| puts arg end
No block given to bar
Block given to foo
Returned from bar
=> nil
发布于 2010-09-10 03:56:32
这只是个惯例。
https://stackoverflow.com/questions/3680097
复制相似问题