0

我目前正在 Codecademy 的 Ruby 课程和“哈希和符号”部分学习。这是我正在使用的代码:

strings = ["HTML", "CSS", "JavaScript", "Python", "Ruby"]

symbols = []

strings.each do |x|
    if x =='s'
        x.to_sym!
        symbols.push(x)
    end
end

此代码的目的是如果在字符串中遇到“s”,则将字符串的元素添加到符号变量中。但是,代码没有通过。我查看了一个解决方案,发现了这个:

strings = ["HTML", "CSS", "JavaScript", "Python", "Ruby"]

 symbols = []

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

我的问题是,Ruby 是否接收到数组中实际的“s”。这对我来说似乎是硬编码???

4

3 回答 3

0

似乎您实际上是在尝试将每个字符串变成一个符号。如果是这种情况,运行 each 方法将简单地忽略任何 's'。要查看工作解决方案中实际发生的情况,让我们首先分解您的解决方案。

strings = ["HTML", "CSS", "JavaScript", "Python", "Ruby"]
symbols = []
strings.each do |x|
#So, if x is equal to a Class String of S
    if x =='s'
#Turn that x into a symbol, which none of them should work
         x.to_sym!
         symbols.push(x)
    end
end

这是你说的代码有效。

 strings = ["HTML", "CSS", "JavaScript", "Python", "Ruby"]
 symbols = []
 #Similar each loop, but they used s and not x
 strings.each do |s|
 #Instead of checking whether there is a Class String of S, it is just
 #turning each value in the array into a symbol and pushing to the
 #symbols array
     s= s.to_sym
     symbols.push(s)
 end

因此,总而言之,除非's'数组中有一个,否则您的代码将永远无法工作,其中可能有 s,但没有一个带有 s 的字符串。后者之所以有效,是因为它在没有 if 语句的情况下全部更改了它们。

-edit- 我从代码学院查看了问题,我可以看到混淆来自哪里,这就是这条指令For each s in strings, use .to_sym to convert s to a symbol.这有点令人困惑的伪代码,但让我重新格式化它,这样你就可以看到混淆发生在哪里,strings.each |s| { s = s.to_sym }所以目标是使用s作为你的空变量。您不需要检测s,只需将其用作空变量即可。

于 2016-06-05T05:06:09.920 回答
0

我会写这样的东西:

strings = ["HTML", "CSS", "JavaScript", "Python", "Ruby"]
symbols = strings.select { |s| s =~ /s/i }.map(&:to_sym)
#=> [:CSS, :JavaScript]

解释:

select选择需要条件的数组的所有元素。这个例子的条件是:字符串s应该匹配不区分大小写的正则表达式/s/i(也就是字符串包含's'或'S')。那说strings.select { |s| s =~ /s/i }会回来['CSS', 'JavaScript']的。

map(&:to_sym)返回数组,但首先调用to_sym每个元素。

另一种选择可能是:

symbols = strings.map { |s| s.to_sym if s =~ /s/i }.compact
于 2016-06-04T13:39:46.270 回答
0

您发布的 Codeacademy 的解决方案实际上并没有解决您解释的问题。一个实际的解决方案看起来像这样

strings = ["HTML", "CSS", "JavaScript", "Python", "Ruby"]
symbols = []

strings.each do |s|
    if s.downcase.include? 's'
        s= s.to_sym
        symbols.push(s)
    end
end
于 2016-06-04T13:17:36.807 回答