Ruby方法'to_sym'是什么?

69

to_sym方法是什么?它有什么用途?

2个回答

76

to_sym将字符串转换为符号。例如,"a".to_sym变成了:a

这不是Rails特有的功能,纯Ruby也有此功能。

在一些Ruby版本中,似乎符号可以转换为和从Fixnum(整数)相互转换。但是,在Ruby 1.9.2-p0的ruby-lang.org中,irb并不允许除非你为Fixnum添加自己的to_sym方法。我不确定Rails是否这样做,但无论如何似乎并不是很有用。


9
如果您在代码中使用 to_sym,请注意!可能会出现内存泄漏问题。Ruby 永远不会释放符号(symbol)的内存空间。 - fotanus
44
@fotanus 我猜你指的是内存泄漏,而不是某种蔬菜:http://en.wikipedia.org/wiki/Leek - Andrew Grimm
你好@cHao,感谢你的回答。请问为什么带有!.to_sym!无法工作?我在这个ideone中使用了它:http://ideone.com/D7dZNz,但似乎它并没有起作用。谢谢! - Gaurang Tandon
4
因为字符串没有to_sym!方法。方法名末尾的!实际上是名称的一部分。(Ruby允许方法名以?!结尾。) - cHao
@GaurangTandon:你可能在九年后才知道这个,但如果字符串有一个to_sym!方法,那就意味着我们想要将原始字符串更改为符号,而我们可能并不想这样做,因为原始字符串可能是不可变的。to_sym从字符串中返回一个符号,而不尝试更改原始字符串,这可能会导致问题。 - Steven Hirlston
@StevenHirlston 哇,十年的怀旧感啊哈哈。我很久以前就停止使用Ruby了,所以我没有完全理解你的评论,但我相信其他访问者会明白的。感谢澄清! - Gaurang Tandon

1

在@cHao提供的答案中,提供了有用的细节:
当需要将原始string变量转换为symbol时,使用to_sym

在某些情况下,可以通过一开始就将变量创建为symbol而不是string来避免使用to_sym。例如:

my_str1 = 'foo'
my_str2 = 'bar baz'

my_sym1 = my_str1.to_sym
my_sym2 = my_str2.to_sym

# Best:
my_sym1 = :foo
my_sym2 = :'bar baz'

或者

array_of_strings = %w[foo bar baz]
array_of_symbols = array_of_strings.map(&:to_sym)

# Better:
array_of_symbols = %w[foo bar baz].map(&:to_sym)

# Best
array_of_symbols = %i[foo bar baz]

参见:

何时在Ruby中使用符号而非字符串?
何时不要使用to_sym在Ruby中?
将字符串转换为哈希表中的符号的最佳方法是什么?
大写字母 %I - 由空格分隔的插值符号数组


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