在符号和字符串之间转换

时间:2018-04-25 04:19:57

标签: ruby

我被问到这个问题:

  

我们有一系列字符串,我们希望稍后将其用作哈希键,但我们更确切地说它们是符号。

     
      
  1. 创建一个新变量symbols,并在其中存储一个空数组。
  2.   
  3. 使用.each迭代strings数组。
  4.   
  5. 对于s中的每个strings,使用.to_syms转换为符号,然后使用.push将新符号添加到symbols }。
  6.   
  7. 打印symbols阵列。
  8.   

给出的正确答案是:

strings.each do |s|
  symbols.push(s.to_sym)
end 

print symbols

我是这样做的:

strings.each do |string|
  if strings.include? "s"
    strings.gsub! (/s/, .to_sym)
  end
  symbols.push (string)
end

print symbols

代码没有用。我正试图在这方面寻求帮助。

2 个答案:

答案 0 :(得分:4)

正如@tadman所提到的,问题根本不是gsub,而是迭代数组并对每个元素应用操作来创建新数组。

您在问题中显示的“正确”答案是可行的,但更典型的Ruby解决方案是使用map,如下所示:

>> strings = ["cat", "deer", "mouse"]
>> symbols = strings.map { |s| s.to_sym }
#> [:cat, :deer, :mouse]

无论何时你看到这个模式,在块变量上调用一个方法,你可以使用更简洁的速记:

>> symbols = strings.map(&:to_sym)
#> [:cat, :deer, :mouse]

答案 1 :(得分:1)

您的代码是"如果字符串包含字母 s "不是"对于数组中的每个字符串( s )..."。这意味着他们在您循环时使用变量s来表示每个条目。

问题是使用经典的数学说法,例如"对于群体 O 中的每个人 P ...其中 O 代表生活在城市中的所有人的集合 C ..."

代码无法正常工作的原因是:

strings.gsub! (/s/, .to_sym)

这不是有效的Ruby。 .to_sym方法必须对某些内容进行操作,它不会孤立地工作。另外,strings是一个数组,它实际上不是一个字符串。在您的循环中string表示单个条目。它应该更像这个:

string.gsub!(/s/, string.to_sym)

然而,这仍然不对,因为你不能在字符串中包含符号。对象是字符串符号,而不是两者。

以下答案是正确的,因为它会将符号值推入,并且不需要gsub