Ruby 在符号和字符串之间转换
有人问我这个问题:Ruby 在符号和字符串之间转换,ruby,Ruby,有人问我这个问题: 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 我们有一个字符串数组,希望以后用作散列键,但我们更希望它们是符号 创建一个新变量
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
我们有一个字符串数组,希望以后用作散列键,但我们更希望它们是符号
symbols
,并在其中存储一个空数组.each
迭代字符串
数组strings
中的每个s
,使用.to_sym
将s
转换为符号,并使用。按
将新符号添加到符号中李>
打印符号
数组
给出的正确答案是:
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
我是这样做的:
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
代码不起作用。我正试图获得这方面的帮助。对于数组中的每个字符串,您的代码是“如果字符串包含字母s”,则为“not…”。这意味着它们暗示在循环时使用变量s
来表示每个条目
这个问题是用经典的数学语言表述的,比如“对于人口O中的每个人p…其中O代表居住在城市C中的所有人的集合…”
代码不起作用的原因是因为这行代码:
strings.gsub! (/s/, .to_sym)
那是无效的。.to_sym
方法必须对某些东西进行操作,它不是孤立地工作的。另外,strings
是一个数组,它实际上不是一个字符串。在循环中,字符串
表示单个条目。应该是这样的:
>> strings = ["cat", "deer", "mouse"]
>> symbols = strings.map { |s| s.to_sym }
#> [:cat, :deer, :mouse]
>> symbols = strings.map(&:to_sym)
#> [:cat, :deer, :mouse]
但这仍然是不对的,因为字符串中不能有符号。对象是字符串或符号,而不是两者
下面的答案是正确的,因为它将一个符号值推入,并且不需要gsub
。正如@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]
每当您看到这种模式时,只要对块变量调用一个方法,就可以使用更简洁的简写方式,如下所示:
>> strings = ["cat", "deer", "mouse"]
>> symbols = strings.map { |s| s.to_sym }
#> [:cat, :deer, :mouse]
>> symbols = strings.map(&:to_sym)
#> [:cat, :deer, :mouse]
s
是引用问题中定义的变量。即使在引用该问题之前,也不要在问题的主体中写下这一点,就好像s
用于表示名为strings
的数组中的每个字符串是一个既定事实。挑剔:&
不仅仅是关于“对块变量调用的单个方法”这是一种更通用的方法,可以将任何内容转换为proc并将结果作为块传递给接收器,例如[1,2,3,4,5].detect(&3.method(:==)
。在前面提到的情况下,它之所以有效是因为实现了。