【问题标题】:Ruby: How to get symbol via a var that saves a string?Ruby:如何通过保存字符串的 var 获取符号?
【发布时间】:2013-08-22 02:25:40
【问题描述】:

见以下代码:

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 行,我从标准输入输入“Hello”并将此字符串保存到 var str1。在第 2 行,我将字符串“Hello”保存到 var str2。现在 str1 和 str2 包含相同的字符串,尽管它们是不同的字符串对象,并且它们的值相同。根据符号规则,我除了可以从 str1 和 str2 中获取“Hello”的游戏符号。但输出是:

Hello
213748
213548
213548

看起来 str1 与 str2 有不同的符号。如何从 str1 中获取“Hello”的符号?

我问这个问题是因为我面临一个问题,我需要从标准输入输入一些单词,然后使用这些单词作为键来构建哈希表。由于哈希表应该使用符号作为键以避免内存浪费,因此我需要获取输入单词的符号。

【问题讨论】:

  • 不要使用to_sym()object_id(),只使用to_symobject_id。这是编写别人喜欢阅读的 Ruby 的关键。

标签: ruby


【解决方案1】:

现在 str1 和 str2 包含相同的字符串,虽然它们是不同的字符串对象,但它们的值是相同的

你的假设不正确。

符号不同是因为字符串不同。 gets 中的字符串以换行符结尾。您可以通过检查:"Hello\n".object_id 的值来证明这一点。

使用strip 删除尾随的换行符,两个字符串将是相同的,并且都将to_sym 转换为相同的符号:

puts str1.strip.to_sym.object_id

【讨论】:

  • 谢谢,你是对的。然后是另一个问题。由于 str1 已经包含“\n”,为什么第 3 行“puts str1”不打印空行?剂量放吃“\n”?
  • 否;它确实放了一个空的换行符。我认为您误解了输出。试试puts "|#{str1}|"
  • @EvanLi puts 将在输出中添加一个换行符除非已经有一个换行符作为最后一个字符。所以puts "foo"puts "foo\n" 有相同的结果。来自the documentation“在尚未以换行符序列结尾的任何内容之后写入记录分隔符(通常是换行符)。”
【解决方案2】:

@meagar 关于换行符是正确的,但是您也可以使用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 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-01-25
    • 1970-01-01
    • 1970-01-01
    • 2016-07-27
    • 1970-01-01
    • 1970-01-01
    • 2014-07-05
    • 1970-01-01
    相关资源
    最近更新 更多