Ruby问题"||" "要么"?

Kev*_*vin 2 ruby

开始Ruby问题:

我正在尝试查看字符串变量的内容是"个人""电子邮件"还是"密码".

我尝试着:

if params[:action] == "password" || "email" || "personal"
  foo
else
  don't foo
end
Run Code Online (Sandbox Code Playgroud)

但这不起作用并返回奇怪的结果,并使用IRB来玩"或"语句我不知道为什么会发生以下情况:

irb(main):040:0> a = "email"
=> "email"
irb(main):041:0> a == "password" || "email"
=> "email"
irb(main):042:0> a == "email" || "password"
=> true
Run Code Online (Sandbox Code Playgroud)

我只是想要一些东西,如果3个变量中的任何一个都是真的,无论它们处于什么顺序都返回true,否则返回false.有人想帮这个n00b吗?

pol*_*nts 13

这个具体问题会有很多好的解决方案,但我会专注于boolean教育目的的逻辑

你会想要这样做:

(a == "password") || (a == "email) || (a == "password")
Run Code Online (Sandbox Code Playgroud)

编程语言不像英语:它有严格的语法规则,而不是说:

"if x is 3 or 5"
Run Code Online (Sandbox Code Playgroud)

大多数编程语言中,你必须说:

if x is 3 or x is 5
Run Code Online (Sandbox Code Playgroud)

同样,在数学符号中常见的地方是:

"if a < b < c"
Run Code Online (Sandbox Code Playgroud)

大多数编程语言中,你必须说:

if a < b and b < c
Run Code Online (Sandbox Code Playgroud)

让我们看看您的实验会发生什么:

 a == "password" || "email"
Run Code Online (Sandbox Code Playgroud)

由于所谓的"运算符优先级",这被解析为:

 (a == "password") || "email"
Run Code Online (Sandbox Code Playgroud)

现在,因为a == "email",这基本上评估为:

 false || "email"
Run Code Online (Sandbox Code Playgroud)

这就是为什么这个表达式的评估结果"email".

同样,:

 a == "email" || "password"
Run Code Online (Sandbox Code Playgroud)

这本质上是

 true || "password"
Run Code Online (Sandbox Code Playgroud)

这就是它评估的原因true.

  • 你也可以写"%w(密码邮件无论如何).include?a". (8认同)
  • PolyGeneLubricants:你是男人之王.应该有写好的歌曲和华丽的散文,以讲述你的智慧,并在整个土地上传播你的知识传说.谢谢您的帮助! (2认同)

gle*_*man 5

case声明也适合匹配这个或那个或......

case email
when "password", "email", "whatever"
  puts "found a match: #{email}"
else
  puts "no match"
end
Run Code Online (Sandbox Code Playgroud)