对于做同样事情的许多不同方式感到困惑

时间:2016-06-04 13:02:21

标签: ruby hardcode

我目前正在编写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是否接受了实际的'在数组中。这对我来说似乎很难编码???

3 个答案:

答案 0 :(得分: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

答案 1 :(得分: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

答案 2 :(得分:0)

好像你实际上是想把每个字符串变成一个符号。如果是这种情况,运行每个方法只会忽略任何'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语句的情况下更改它们。

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