我在我的代码中设置符号,例如:
"name_of_symbol".to_sym
但是,我的首席工程师在代码审查期间将其视为一种不好的做法,并要求我设置如下符号:
:"name_of_symbol"
当我问他为什么?他说这是不好的做法,但是当我问他为什么这么说时,这并不是一个真正令人满意的答案。所以怎么回事?有什么区别吗?
我在我的代码中设置符号,例如:
"name_of_symbol".to_sym
但是,我的首席工程师在代码审查期间将其视为一种不好的做法,并要求我设置如下符号:
:"name_of_symbol"
当我问他为什么?他说这是不好的做法,但是当我问他为什么这么说时,这并不是一个真正令人满意的答案。所以怎么回事?有什么区别吗?
冒号表示一个符号。我不会把它称为不好的做法,而是非常规的做法,这可能会使代码更难理解。
我知道这:"Some weird stuff"
是合法的,但我不喜欢它,我个人宁愿使用:Some_weird_stuff
引号并将引号放在一起 - 当你不需要时使用引号只是增加噪音 - 我非常反对噪音。噪音是不好的做法,它使理解需要更长的时间。
有时,当您匹配以字符串形式出现的内容但为了保持一致性而需要符号时,您没有太多选择,但我宁愿不必问这个问题,FWIW。
当你有语法上干净的符号时,你可以使用
{ thing: "value" }
语法,这是一种乐趣,非常清晰和整洁。
不过有趣的是:
irb
> class String ; def to_sym ; puts "bob" ; end ; end
=> nil
> "fred".to_sym
bob
=> nil
> :"fred"
=> :fred
所以鲍里斯的观点是有效的。
一个是Symbol
文字,另一个是String
您调用方法的文字。
String
就我个人而言,当你的意思是写 a 时,我觉得写 a 很奇怪,Symbol
然后立即将 a 转换String
为 a Symbol
。为什么不Symbol
先写一个?这让你的意图更加清晰。
其他答案正确地认为:"foo bar"
优于,"foo bar".to_sym
因为它更清晰,更好地表达了你的意图,更具可读性,更快等。但还有一个原因:"foo bar".to_sym
依赖于String#to_sym
方法,并且这种方法有可能(尽管远程)可能是重新定义。:"foo bar"
这是原则上更好的做法的一个非化妆品原因。
这似乎是一个偏好问题,但我可以看到将符号编写为符号比编写要更改为符号的字符串要清晰得多。
此外,当您使用snake_case 时,引号是不必要的。
"name_of_symbol".to_sym
:"name_of_symbol"
:name_of_symbol
这是一个风格问题,但在我看来,3 是这三个版本中最易读和最简洁的版本。如果“最佳实践”意味着易于阅读并因此易于维护,我会说 3 胜。