Ruby符号设置

6

我在我的代码中设置符号,如下:

"name_of_symbol".to_sym

然而,我的主要工程师在代码审查中发现它是一种不好的做法,并要求我设置符号,例如:

:"name_of_symbol"

当我问他为什么?他说这是一个不好的做法,但当我问他原因时,他只是说“就是这样”,这并不是一个令人满意的答案。那么它到底有什么区别吗?


5
这似乎是你们工作场所的惯例,不是一个“不良实践”的问题。惯例就是惯例,没有必要争论(我们为什么把“树”称为“tree”,而不是“gluff”?因为我们同意使用“tree”)。有人可能会争论“可读性”,但如果没有进行实际的科学研究来证明:sym语法更易于阅读,那么这只是一个说法。另一方面,如果那个人拒绝解释,那就是我们无法帮助你的事情:(我的建议是:用:sym定义一个符号,但对于显式转换为符号,请使用.to_sym - Mörre
4
这并不是不良实践。不良实践是在你作为项目团队领导时无法解释某件事情。 - Rustam Gasanov
这也不是一个好的实践。请注意,如果您的符号不包含空格和其他可能被Ruby解析器歧义解释的字符,则不需要引号。因此,:foo_bar没有问题,不需要引号,只有在 :"foo bar" 的情况下才需要引号。 - Boris Stitnicky
2
我正在思考如何为PE的答案辩护。也许PE没有时间解释,但是他/她本可以说,“等我有时间了再解释”。我的怀疑天性认为“这是不好的做法”意味着“我不知道”。许多人似乎无法说出这最后三个字,他们无法理解如果能这样做,他们在同行中的地位会提高。 - Cary Swoveland
4个回答

6
冒号表示符号。我不会说这是不好的实践,只是非传统的做法可能会使代码更难理解。
我知道:“一些奇怪的东西”是合法的,但不喜欢它,个人而言,我更愿意使用:Some_weird_stuff,并完全省略引号 - 当你不需要使用引号时使用引号只会增加噪音 - 我非常反对噪音。噪音是不好的实践,它会延长理解时间。
有时,当您将字符串匹配为符号时,为了保持一致性,您没有太多选择,但我更喜欢不必问这个问题,FWIW。
当您拥有语法清晰的符号时,可以使用
{ thing: "value" }

语法非常清晰简洁,令人愉悦。

有趣的是:

irb
> class String ; def to_sym ; puts "bob" ; end ; end
  => nil
> "fred".to_sym
  bob
  => nil
> :"fred"
  => :fred

所以Boris的观点是有道理的。

我应该在我的问题中注明,这是针对符号被动态设置的情况,例如array.each{|s| :"#{s}"},因此按照我的方式,它将是"#{s}".to_sym。 - Jakub Zak
4
你手头有一个字符串,现在想要做的是:"#{s}" - 我个人会选择使用to_sym,即在后台插值一个字符串然后调用to_sym函数...我认为这样有点无意义 :) - Ghoti
3
换句话说,不要使用:"#{s}""#{s}".to_sym,直接使用s.to_sym - Ajedi32
"#{s}" 保证您获取期望的符号,即使有人篡改了 String 类的 to_sym 方法 - 所以更安全。为什么有人这样做除了成为讨厌的人之外还有其他原因,这是一个不同的问题 :) - Ghoti

4

其中一个是 Symbol 字面量,另一个是调用方法的 String 字面量。

个人认为,当您想要写一个 Symbol 时却写了一个 String,然后立即将其转换为一个 Symbol,这种做法很奇怪。为什么不一开始就写一个 Symbol 呢?那样更清楚明确您的意图。


1
举个例子,如果某个方法返回一个字符串,那么 method_which_returns_a_string.to_sym 就是正确的做法,这并不奇怪。 - Rustam Gasanov
@RustamA.Gasanov:但这不是这个问题的重点。问题是直接使用符号字面量,而不是将字符串字面量转换为符号。显然,完全不同的问题可能有完全不同的答案。 - Jörg W Mittag

3
其他答案正确地认为:"foo bar"优于"foo bar".to_sym,因为它更清晰,更好地表达了您的意图,更易读,速度更快等等。但还有一个原因:"foo bar".to_sym依赖于String#to_sym方法,而这个方法可能会被重新定义(虽然很少见)。这是:"foo bar"在原则上更好的实践的一个非表面原因。

3
没错,尽管重新定义 to_sym 势必会在全球引发骚乱。 - Cary Swoveland
当然会。这基本上是一个纯理论的论点。 - Boris Stitnicky

2
这似乎是一种偏好,但我可以看出,将符号作为符号编写比编写要更清晰的字符串更清晰。
另外,在使用snake_case时,引号是不必要的。
  1. "name_of_symbol".to_sym
  2. :"name_of_symbol"
  3. :name_of_symbol
这是一种风格问题,但在我看来,3是三个版本中最可读和简洁的。如果“最佳实践”意味着易于阅读和因此易于维护,那么我会说3胜出。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接