Ruby 使用大括号是否违反;红宝石路;?

Ruby 使用大括号是否违反;红宝石路;?,ruby,forms,builder,curly-braces,Ruby,Forms,Builder,Curly Braces,我已经使用Ruby大约两周了,而且我的编程时间也不算太长,但我是从C风格的背景(C++、C#等)开始学习这门语言的。总之,我的一位好朋友和导师正在看我前几天写的一些Ruby,他告诉我,如果他发现我在Ruby中再次使用花括号,他会打我一巴掌 我昨天刚刚通过via了解到Builder,他们发布的示例使用了大括号。有没有其他方法可以做到这一点,或者您必须在Builder中使用大括号 这似乎是个小问题,但我对Ruby还不熟悉,我不想让自己养成任何坏习惯。你们觉得怎么样?惯用的ruby是 method_n

我已经使用Ruby大约两周了,而且我的编程时间也不算太长,但我是从C风格的背景(C++、C#等)开始学习这门语言的。总之,我的一位好朋友和导师正在看我前几天写的一些Ruby,他告诉我,如果他发现我在Ruby中再次使用花括号,他会打我一巴掌

我昨天刚刚通过via了解到Builder,他们发布的示例使用了大括号。有没有其他方法可以做到这一点,或者您必须在Builder中使用大括号

这似乎是个小问题,但我对Ruby还不熟悉,我不想让自己养成任何坏习惯。你们觉得怎么样?

惯用的ruby是

method_name {|param| param.do_something} # squigglies for one liners

# do/end for multi-line
method_name do |param|
  param.do_something
end
这样做的一个原因是链接,
foo.map{f | f.num}.reduce(0){memo,i | memo+i}
看起来比挂起
end
这样的方法调用更好

foo.map do |f| 
  f.num
end.reduce(0) do |memo, i| 
  memo + i
end
end
调用一个方法有点奇怪,尽管在语法上两者是等价的。

“Ruby方式”并不提倡任何特定的风格。如果他们不想让你选择使用花括号,那么它就不会出现在语言中。也就是说,要符合团队的编码风格(如果您与团队一起工作)

我见过的大多数Ruby代码都使用
end
来代替花括号,但我不使用Ruby,所以我不能肯定这是首选的样式。Ruby有不止一种做事方式——你可以用任何你喜欢的方式(在合理的范围内)。

虽然有些人喜欢“一行的大括号,多行的结束”,但我个人认为以下规则最符合逻辑:

  • 当区块有副作用时(通常使用
    每个
    和相关方法),使用
    do end
    ,并且
  • 当块没有副作用时使用大括号(
    map
    inject
    等)
这种逻辑与Matt所写的方法链接问题非常吻合

这种方法的一个好处是,每次编写块时,它都会让您考虑副作用,这些副作用非常重要,尽管有时会被没有函数编程背景的程序员忽略

另一种不涉及副作用的说法是:

  • 对执行的块使用
    do end
  • 返回的块使用
    {
    }
这里有几篇文章提供了更多信息:


通常的惯例是
{…}
块用于一行程序和
do。。。对于多行程序,结束
。我通常遵循这个惯例,但如果我成为国王,我想我会使用
do。。结束
更频繁

{}
偶尔出现的一个问题是
{}
绑定比
do end
更紧密,因此为同样具有参数的方法编写诗歌模式块的唯一方法是使用
do end
,否则该块将是参数的一部分,不会直接传递给该方法

def f x
  yield x
end

f 123 do |n| p n end  # works
f 123  { |n| p n }    # does not work
f(123) { |n| p n }    # works, of course
当然,如果您想在诗歌模式中将一个块附加到一个参数上,那么您可以使用
{}
后跟
do end
来获胜

def g  ; p ['g', yield] end
def f x; p ['f', yield] end

f g { 2 } do 3 end
["g", 2]
["f", 3]

最后,与您在这里收到的一些建议相反,a
end

之前不需要code>,我明白您关于挂起方法调用结束的意思了。。。这看起来很奇怪。谢谢你的洞察力。@Matt Briggs,你为什么认为
do。。end
{..}
需要更多的分号?@DigitalRoss:我刚试过,你说得对,它不需要分号。我假设这就像做一行
def
,结尾需要在自己的行上,或者需要用分号结束语句。更正答案。@kivetros:有时候做一行就行了。例如,
def foo'foo';结束
Foo类;结束
如果条件允许?然后是‘福’;结束
。“我总是认为做/结束是同一件事。”马特,我明白了。谢谢你的提示。我想拉甘瓦尔德也提出了这个建议(或者类似的建议)。碰巧的是,我通常非常喜欢他的想法,除了这一个:-)带{}的多行块看起来很糟糕…@Matt:Haha,不,Ruby是我到目前为止得到的FP。但是我理解它的力量以及它在分布式和并行计算中所获得的意义,然而,至少在我的环境中,人们大多来自OO和命令式语言,根本没有FP培训。@Andrew Grimm:整个函数纯度的事情可能在编程语言之前就出现了(大多数像这样的FP概念都源于数学)。肯定是在OO之前,我认为可以肯定地说这不是一种时尚。@Mladen:是的,我也是从ruby来FP的。一位同事(现在是朋友)基本上认为引入变量是个人的失败,他会通过将函数链接在一起并滥用数据结构来编写代码,而不是像大多数人那样首先达到迭代和变量的目的。工作中的每个人都称他为“单线奇迹”,但我认为这是我见过的最优雅的编码风格之一。现在我是一个lisp迷(在空闲时间),写ruby和javascript时尽可能接近lisp(无需实现s-exp解析器)@Andrew:没有什么立竿见影的好处(除了可读性和优雅,这有点主观),但从长远来看,意识到这一点是很好的——也许会出现另一个Ruby解释器,它将知道如何使用纯功能块,或者我们将代码迁移到另一种语言,提前思考可以节省一些工作。当然,我们不应该在另一种方法更优雅的地方强制使用FP风格。诗歌模式?Elaborate,拜托。@kivetros,“诗意模式”指的是在方法调用参数周围不使用
(…)
的情况下编写Ruby。这是一个命令
def g  ; p ['g', yield] end
def f x; p ['f', yield] end

f g { 2 } do 3 end
["g", 2]
["f", 3]