如何有效地在Ruby中结束嵌套块?

时间:2017-11-28 13:03:13

标签: ruby nested

在Ruby中,一个块以保留字“end”结束。 嵌套块需要自己的结束。

var_a = a
var_b = b

if var_a
  if var_b
    ... do something
  end
end

写一下:end(amount_of_ends_needed)

if var_a
  if var_b
    ... do something
end(2)

Ruby中可能有这样的东西吗?

编辑:

我看到人们不赞成这个想法。 然而,一个论点是在end(some_value)内使用变量。

value = query
if var_a
  if var_b
    ... do something
end(value)

并拥有动态的嵌套量。 通过剪切多余的嵌套块。

我在另一页上发现了这个: Ruby multiline block without do end位于页面底部,是指向seamless

的链接
  

Python允许您通过缩进来表示代码块的结尾。 Ruby遭受了一个非常冗长乏味的块终止符“end”。就像Lisps最终得到的数十个密切关注一样,使用模块和类的Ruby文件最终会导致过多的“结束”,而这些结果并不是必需的。   写一个Ruby文件,但跳过所有“结束”。像在Python中一样排列代码块。然后只需将其命名为'your_file.rbe',要求'无缝',并要求'your_file'。其余的都是无缝的。   这应该被广泛使用吗?我不知道。但它非常有趣!

3 个答案:

答案 0 :(得分:3)

我不知道任何语言,这是一个功能。在我看来,它会造成一种可怕的语言设计。

听起来你是来自python背景,这是(不像红宝石)对空格敏感的。认为 作为一种理想的语言特征具有一些优点,但此时不会将其构建到ruby中。

有趣的是,你不是第一个提出这个想法的人。 Here's an amusing (joke/rejected) ruby feature request from a few years ago

module MyModule
  class MyClass
    def my_method
      10.times do
        if rand < 0.5 
          p :small
        ennnnnd

或者:

 module MyModule
   class MyClass
     def my_method
       10.times do
         if rand < 0.5
           p :small
 eeeeeeeeend
         ^^^ <- same place of original "end"!

或者:

module MyModule
  class MyClass
    def my_method
      10.times do
        if rand < 0.5 
          p :small
endmodule

或者:

module MyModule
   class MyClass
     def my_method
       10.times do
         if rand < 0.5
           p :small
end!

或许这应该是“折叠”语法:

module MyModule
  class MyClass
    def my_method
      10.times do
        if rand < 0.5 
          p :small
fuuuuu

答案 1 :(得分:1)

不,这违反了基本的ruby语法,并且在解析器级别本身会失败。这不是关于效率,你不会通过这样做获得任何有意义的性能提升。如果你想要在每个块的结尾之后编写额外的工作,请使用插件在你喜欢的文本编辑器中执行此操作

请注意, 如果您的代码嵌套太多,那么这可能是代码味道

答案 2 :(得分:0)

  

是否真的可以拥有此功能? end(value)

当然,只要有足够的决心,一切皆有可能。虽然,没有一种语言可以解释这一点。原因是在实践中没有人写一千个嵌套ifs,所以这样的功能具有可忽略的实际好处,而在实现和理解中极其昂贵。

例如,您建议在end(x)中放置一个不够大的数字会忽略所有嵌套,其嵌套大于该嵌套。这是一种我不会用一英里长的杆子接触的语言。我的代码都可以正常工作或无法解析。

但是根本没有end的语言,其中嵌套由缩进控制。像python或coffeescript。因此,如果您对写出结尾感到困扰而且编辑没有帮助,那么您可以尝试使用它们。您仍然需要密切关注当前键入代码的缩进程度。相同的硬币,不同的一面。