在调用函数/方法时是否有明确的标准或指南来使用或不使用括号?
例如,以下代码:
class List < Jets::Stack
sqs_queue(:dead_letter)
end
我应该还是不应该使用括号?其他示例:
class ExampleJob < ApplicationJob
def sqs_event ref(:dead_letter)
end
end
vs。
class ExampleJob < ApplicationJob
def sqs_event ref :dead_letter
end
end
我可以遵循官方指南吗?
[没有关于Ruby代码最佳做法的官方标准。但是,Ruby社区已经开发了一组首选样式。遵循这些首选样式是一个好主意,因为这会使您的代码更易于其他Ruby程序员阅读。
Nick Roz已为您提供了指向样式指南的链接。我也建议您考虑安装和使用rubocop。它将为您提供有关何时以及何时不带括号的参数,许多其他格式问题(例如适当的缩进)以及在特定情况下通常选择几种不同语法选项中的哪一种的反馈。
通常要回答关于是否对方法参数使用括号的特定问题,答案是肯定的。正如指南所说,异常是“在Ruby中具有'关键字'状态的方法。”一个示例是puts
(实际上是Kernel.puts
方法)。大多数人在这里不使用括号,但是指南指出它们是可选的。
[正如尼克所说的另一个例子(尽管“带有关键字参数的方法”并不完全正确;在这种情况下,参数是代表方法而不是关键字的符号)是attr_accessor
,实际上是Module.attr_accessor
。
因此,作为一般规则,如果它看起来像“命令”(如果可以的话,则为“关键字”),但实际上是一种方法,请省略括号。否则,请使用它们。而且,如果您不确定差异,请养成使用rubocop的习惯。
我想您正在寻找社区指南,因为没有Ruby核心团队提供的样式指南。
嗯,每当调用一个方法时,都应使用括号,否则将变得不清楚
# bad
x = Math.sin y
# good
x = Math.sin(y)
# bad
array.delete e
# good
array.delete(e)
# bad
temperance = Person.new 'Temperance', 30
# good
temperance = Person.new('Temperance', 30)
但是建议在没有参数的情况下跳过它们。
请注意super
和super()
它们是不同的!
我唯一的例外是某种定制的DSL,例如对于DSL本身必须有一些规则或偏好。
validates :name, presence: true
对于带有关键字参数的方法也是如此:
attr_reader :name, :age
在Ruby中通常是可选的。
Ruby趋向于简约,因此通常避免使用它们。
有时它们是必需的,例如在rspec中,期望在哪里
expect a.to be true
必须是
expect(a).to be true
除非调用参数的默认值,即调用具有参数的方法时,不使用任何括号或为空的括号都会导致ArgumentError
。>
def a(x=1)
另一个考虑因素是,当您想对某结果的结果调用方法时,当您需要使该方法明确地位于最终结果上时,即
"br" + "own".upcase brOWN
但是
("br" + "own").upcase BROWN
最后,当我谈论清晰度时,有时即使没有严格的要求,也最好设置它们。通常,这是在复合表达式中,而不是依赖于运算符的优先级等。或者,如果您想要一个特定的表达式不能由标准运算符的优先级执行,并且想要自己的分组和运算顺序,例如:
irb(main):007:0> 5 + 6 * 2 => 17 irb(main):008:0> (5 + 6) * 2 => 22
正如尼克所指出的,一个复杂度是
super
,其中super
或super()
传递了参数,但是super(a,b)
调用了super
并使用...a
,b
作为参数
根据Matz: