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