Ruby:如何通过保存字符串的var获取符号?

时间:2013-08-22 02:25:41

标签: ruby

请参阅以下代码:

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输入一些单词,然后使用这些单词作为构建哈希表的关键。由于哈希表应该使用符号作为键来避免内存浪费,我需要得到输入词的符号。

2 个答案:

答案 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