在条件中使用逻辑OR运算符

时间:2016-10-16 14:23:03

标签: ruby boolean

我的代码是将字符串“text”与另外两个字符串“redact”和“redact2”进行比较,如果匹配则将其替换为“REDACTED”。

use strict;
use warnings 'all';

use WWW::Mechanize;
use HTML::Entities 'decode_entities';

use constant URL => 'http://texreg.sos.state.tx.us/public/readtac$ext.ViewTAC?tac_view=5&ti=16&pt=1&ch=1&sch=A&rl=Y';

my $mech = WWW::Mechanize->new;

$mech->get(URL);

my $sect = decode_entities('§');
my $rule = $mech->find_all_links(name_regex => qr/^$sect[\d.]+$/);

printf "%d matches\n", scalar @$rule;

我试图通过在puts "Enter your sentense" text = gets.downcase.chomp puts "Enter your 2 words to be reducted" redact = gets.downcase.chomp redact2 = gets.downcase.chomp words = text.split(" ") words.each do |w| if w == redact print "REDACTED " elsif w == redact2 print "REDACTED " else print w + " " end end 语句中使用逻辑OR来简化我的代码,但代码会为所有单词打印if。有人可以解释一下为什么吗?

"RETUCTED"

2 个答案:

答案 0 :(得分:2)

  

有人可以解释一下为什么吗?

因为==绑定比||更强。

因此,您的陈述实际上解释如下:

if (w == redact) || redact2

不像你期望的那样:

if w == (redact || redact2)

要解决这个问题,你几乎没有选择:

  • if w == redact || w == redact2
  • if [reduct, reduct2].include?(w)

如果您热衷于保存更多行,可以将代码简化为:

words.each do |w|
  print [redact,redact2].include?(w) ? "REDACTED " : w + " "
end

答案 1 :(得分:1)

或尝试对两个布尔值进行操作。 你给它w=="redact"这是一个布尔值,"redact2是一个字符串(计算结果为真)。

您实际想要做的是if w == redact || w == redact2