【问题标题】:Ruby on Rails: how we should write symbol - symbol: vs :symbol =>Ruby on Rails:我们应该如何编写符号 - symbol: vs :symbol =>
【发布时间】:2014-05-08 13:34:54
【问题描述】:

我知道symbol: "value"symbol => "value" 都是有效的语法。

目前,我没有标准使用哪一个。比如在image_tag中,有时我写class: "css_class",但有时在模型has_many中,我使用:through => :line_items

通常,我什至将这两者混合在一个代码句子中并自己复杂。

我真的很想听听您的建议,哪些是在特定情况下使用的最佳(正确)方法。 (我知道这两者都是正确的,但更具表现力、干净和漂亮的代码。)可能是你的喜好。

【问题讨论】:

  • 有时您必须使用 hashrocket。我只使用=> 因为我使用MongoDB(即:$set 发生),因为我发现a: :b 在视觉上令人困惑和丑陋,因为我很固执,因为我经常使用非符号作为哈希键,并且因为那些该死的孩子不会离开我的草坪。
  • 是的,我完全同意。我还发现 a: :b 在视觉上令人困惑。

标签: ruby-on-rails ruby syntax ruby-on-rails-4 symbols


【解决方案1】:

为了帮助您决定使用哪种哈希文字语法,请查看:

来自Ruby Style Guide on Collections:

的片段

最好使用符号而不是字符串作为哈希键。

# bad
hash = { 'one' => 1, 'two' => 2, 'three' => 3 }

# good
hash = { one: 1, two: 2, three: 3 }

当散列键是符号时,使用 Ruby 1.9 散列语法。

# bad
hash = { :one => 1, :two => 2, :three => 3 }

# good
hash = { one: 1, two: 2, three: 3 }

不要将 Ruby 1.9 哈希语法与哈希火箭混合在同一个哈希文字中。

如果您的键不是符号,请使用哈希火箭语法。

# bad
{ a: 1, 'b' => 2 }

# good
{ :a => 1, 'b' => 2 }

【讨论】:

  • 设置正确答案真的很难,因为我怕我太依赖我的个人感觉。但我认为您的答案很好,因为提供了语法指南,其中显示了 Ruby 和 Rails 代码格式的一些适当标准化。我认为它可以为这个问题的潜在读者带来好处。
【解决方案2】:

您可能知道,冒号 (key: value) 语法是在 Ruby 1.9 中引入的。如果您正在编写一个库,并将其分发给可能正在运行早期版本 Ruby 的人,请使用箭头 (:key => value) 语法。

除此之外,这完全取决于个人喜好。我更喜欢冒号语法,因为它通常可以减少视觉混乱,因为它在屏幕上减少了一个符号,而不会降低可读性。

不过,我更喜欢箭头语法的一种情况是,在 DSL 中,哈希的箭头语法被使用(或者,可以说,被滥用)来表示“从 X 到 Y”的关系。一个很好的例子是state_machine gem,它描述了这样的转换:

transition :first_gear => :idling

这里的箭头使它读起来几乎像英语:“在idle,处于一档状态的对象应该转换到idling。 "使用冒号语法不会难以辨认,但是因为 state_machine 也允许数组作为键,所以为了保持一致性最好还是使用箭头语法:

transition first_gear: :idling
# ...
transition [:idling, :first_gear] => :parked

在这里他们不匹配,这是一个视觉和精神上的不和谐——不多,但足以值得考虑。

在通过关联进行 ActiveRecord 查询时,我有时也喜欢在 Rails 中使用它,例如

User.where( active: true, :role => { name: "admin" } )
# vs.
User.where( active: true, role: { name: "admin" } )

出于某种原因,=> 有助于加强我对关联或 JOIN 的理解。再说一次,这只是个人偏好,在这种情况下,我认为它比 state_machine 示例中的差异更小。

【讨论】:

  • 感谢您的回答和有趣的提示。
【解决方案3】:

我认为这取决于个人喜好。就个人而言,我尽量避免使用 hashrockets。在某些情况下,您有义务使用 hashrocket,例如:

Post.joins(:comments).where('comments.commenter' => 'Peter')

新语法仅支持符号作为键,不支持字符串。如果您碰巧使用很多字符串作为键,那么您问题的答案显然指向坚持使用 hashrocket。但是,根据我的个人经验,我可以在 9/10 的时间内使用符号作为键。

1.9 引入的新语法对我来说似乎更干净。这很难解释,但如果我用 hashrockets 打开一堆代码并重写代码以使用 : 反而会让我更快乐。我们可以谈论微小的技术差异,但最终真正归结为的外观和感觉更好。对我来说,它与 Coffeescript 的感觉基本相同(尽管这涉及更多的语法更改)。我只是喜欢它在我的编辑器中的外观。

还有一个小考虑。我个人喜欢尽可能使用最新的语法。我不会担心被弃用,但使用 Rails 发展感觉更自然。我不喜欢使用“旧”语法的感觉,这当然是完全主观的。

【讨论】:

  • 我会在我的项目中采纳并使用您的建议。我也尽可能使用最新的语法。 :)
猜你喜欢
  • 1970-01-01
  • 2012-12-08
  • 2012-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-19
  • 1970-01-01
相关资源
最近更新 更多