在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'。其余的都是无缝的。 这应该被广泛使用吗?我不知道。但它非常有趣!
答案 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。因此,如果您对写出结尾感到困扰而且编辑没有帮助,那么您可以尝试使用它们。您仍然需要密切关注当前键入代码的缩进程度。相同的硬币,不同的一面。