请参阅以下代码:
1 str1 = gets
2 str2 = "Hello"
3 puts str1
4 puts str1.to_sym().object_id()
5 puts str2.to_sym().object_id()
6 puts :"Hello".object_id()
在第1行中,我从stdin输入“Hello”并将此字符串保存到var str1。在第2行中,我将字符串“Hello”保存到var str2。现在str1和str2包含相同的字符串,尽管它们是不同的字符串对象,它们的值是相同的。根据符号规则,除了可以从str1和str2得到“Hello”的游戏符号之外。但输出是:
Hello
213748
213548
213548
看起来str1与str2有不同的符号。如何从str1获得“Hello”的符号?
我问这个问题是因为我遇到了一个问题,我需要从stdin输入一些单词,然后使用这些单词作为构建哈希表的关键。由于哈希表应该使用符号作为键来避免内存浪费,我需要得到输入词的符号。
答案 0 :(得分:6)
现在str1和str2包含相同的字符串,尽管它们是不同的字符串对象,它们的值相同
您的假设不正确。
符号不同,因为字符串不同。来自gets
的字符串以换行符结尾。您可以通过检查:"Hello\n".object_id
的值来证明这一点。
使用strip
删除尾随换行符,两个字符串都相同,并且to_sym
都符合相同的符号:
puts str1.strip.to_sym.object_id
答案 1 :(得分:3)
@meagar关于换行符char是正确的,但您也可以使用chomp。
这里演示来自irb的示例会话:
2.0.0p247 :001 > without_chomp = gets
Hello
=> "Hello\n"
2.0.0p247 :002 > with_chomp = gets.chomp
Hello
=> "Hello"
2.0.0p247 :003 > with_chomp_and_to_sym = gets.chomp.to_sym
Hello
=> :Hello