我正在学习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
暂时忽略这样一个事实,即即使它应该是逗号也会打印一段时间。我很好奇为什么当我运行这个程序时,每个单词都在控制台中被编辑。
答案 0 :(得分:1)
声明foo.downcase == (redact + ".") || (redact + ",")
在ruby中始终如此。该陈述的等效内容为:foo.downcase == (redact + ".") || (redact + ",") != nil
您要测试的是:
foo.downcase == (redact + ".") || foo.downcase == (redact + ",")
Ruby可以将任何东西评估为布尔值。只有nil
和False
会被评估为false。
答案 1 :(得分:0)
而不是[错误]检查foo
是这个还是那个,可以使用regular expression:
foo.downcase =~ /\A#{redact}[.,]\z/
当truthy
与foo.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习语的人来说非常容易阅读。因为它涉及创建多个字符串和一个数组,在性能关键循环中不建议这样做,但如果性能/内存使用不是问题则很好。)