Ruby多线程块没有结束

前端之家收集整理的这篇文章主要介绍了Ruby多线程块没有结束前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我是 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++#第一个似乎对我来说比较自然,但在罗马时!

解决方法

两种语法之间存在微妙的区别. {}的优先级高于…结束.因此,以下将通过bar和block到方法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来处理语句结尾处的多行代码块.

然而,{}经常用于那些结束是麻烦的地方,例如,如果你连在一起的几个方法.这可以让您编写一个可以用作方法链一部分的简短的一行小块.

> [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

猜你在找的Ruby相关文章