首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >不带do结尾的Ruby多行块

不带do结尾的Ruby多行块
EN

Stack Overflow用户
提问于 2010-09-10 03:54:44
回答 2查看 17.7K关注 0票数 24

我是Ruby的初学者,所以很抱歉问这么简单的问题,但是这段代码有什么问题吗?

代码语言:javascript
复制
3.upto(9) {
  print "Hello"
  puts " World"
}

代码语言:javascript
复制
3.upto(9) { |n|
  print "Hello "
  puts n
}

它工作得很好,但我看到的大多数代码示例都使用

代码语言:javascript
复制
3.upto(9) do |n|
  print "Hello "
  puts n
end

只对单个语句使用大括号是不是一种惯例?来自C/C#的第一个对我来说似乎更自然,但是在罗马的时候!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-09-10 04:13:44

这两种语法之间有细微的差别。{ }do ... end具有更高优先级。因此,下面的代码将把bar和一个块传递给foo方法

代码语言:javascript
复制
foo bar do ... end

而下面的代码会将一个块传递给bar,并将结果传递给foo

代码语言:javascript
复制
foo bar { ... }

因此,您的示例将执行相同的操作。但是,如果您去掉了括号:

代码语言:javascript
复制
> 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比较麻烦地方,例如,如果您要将接受块的几个方法链接在一起。这可以让您编写简短的、一行的小块,这些块可以用作方法链的一部分。

代码语言:javascript
复制
> [1,2,3].sort{|x,y| y<=>x}.map{|x| x+1}
=> [4, 3, 2]

这里有一个例子来说明这一区别:

代码语言:javascript
复制
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
票数 50
EN

Stack Overflow用户

发布于 2010-09-10 03:56:32

这只是个惯例。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3680097

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档