为什么不是我的||或条件不在这里工作?

时间:2016-05-17 08:05:43

标签: ruby

我正在学习codeacademy,我正在努力使编辑的程序适用于每种情况,包括编辑单词旁边的句点和逗号。我的代码按预期工作:

puts "Please enter a value"
text = gets.chomp
puts "To redact?"
redact = gets.chomp
words = text.split(" ")
words.each do |foo|
if foo.downcase == redact
    print "REDACTED "
elsif foo.downcase == (redact + ".")
    print "REDACTED" + "." + " "
elsif foo.downcase == (redact + ",")
    print "REDACTED" + "," + " " 
else
    print foo + " "
end

end

我在控制台中得到了这个:

Please enter a value
 I am master, right?
To redact?
 master
I am REDACTED, right? ["I", "am", "master,", "right?"]

但是,代码不起作用:

puts "Please enter a value"
text = gets.chomp
puts "To redact?"
redact = gets.chomp
words = text.split(" ")
words.each do |foo|
if foo.downcase == redact
    print "REDACTED "
elsif (foo.downcase == (redact + ".") || (redact + ","))
    print "REDACTED" + "." + " "
else
    print foo + " "
end
end

暂时忽略这样一个事实,即即使它应该是逗号也会打印一段时间。我很好奇为什么当我运行这个程序时,每个单词都在控制台中被编辑。

3 个答案:

答案 0 :(得分:1)

声明foo.downcase == (redact + ".") || (redact + ",")在ruby中始终如此。该陈述的等效内容为:foo.downcase == (redact + ".") || (redact + ",") != nil

您要测试的是:

foo.downcase == (redact + ".") || foo.downcase == (redact + ",")

Ruby可以将任何东西评估为布尔值。只有nilFalse会被评估为false。

答案 1 :(得分:0)

而不是[错误]检查foo是这个还是那个,可以使用regular expression

foo.downcase =~ /\A#{redact}[.,]\z/

truthyfoo.downcase的值匹配,后跟逗号或点时,上述内容将评估为redact

答案 2 :(得分:0)

说明

  

elsif (foo.downcase == (redact + ".") || (redact + ","))

让我们像Ruby编译器一样分解它:

  • elsif XXX查找布尔值XXX(也就是说,在Ruby谈话中,它会查看XXX的真实性)
      评估
    • foo.downcase == (redact + ".") || (redact + ",")==绑定比||更紧密,因此该术语首先在==上拆分
      • foo.downcase返回一个字符串
      • (redact + ".") || (redact + ",")只是运算符||,定义为"如果左操作数是真值,则求值为左操作数;否则就是正确的"。所以ruby看左边的操作数:
        • redact + "."是一个非空字符串,根据定义,它始终是真实的,因此||的结果是左侧(无论redact包含什么)。

因此,返回树时,(redact + ".") || (redact + ",")将评估为redact + ".",并与foo.downcase进行比较,并显示您遇到的结果。

建议

elsif (foo.downcase == (redact + ".") || (redact + ","))表达你的意思的红宝石方式是:

elsif [ redact+".", redact+"," ].include? foo.downcase

(或者,或者,任何数量的其他解决方案,如正则表达式,字符串拆分等等 - 但这个变体最接近你所写的,并且对于熟悉Ruby习语的人来说非常容易阅读。因为它涉及创建多个字符串和一个数组,在性能关键循环中不建议这样做,但如果性能/内存使用不是问题则很好。)