我被问到这个问题:
我们有一系列字符串,我们希望稍后将其用作哈希键,但我们更确切地说它们是符号。
- 创建一个新变量
symbols
,并在其中存储一个空数组。- 使用
.each
迭代strings
数组。- 对于
s
中的每个strings
,使用.to_sym
将s
转换为符号,然后使用.push
将新符号添加到symbols
}。- 打印
醇>symbols
阵列。
给出的正确答案是:
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
代码没有用。我正试图在这方面寻求帮助。
答案 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
。