【问题标题】:"and" vs "&&" operator in rails [duplicate]rails中的“and”与“&&”运算符[重复]
【发布时间】:2015-12-12 20:25:58
【问题描述】:

根据this堆栈问题,

and&& 相同,但优先级较低

我很理解这一点。而且我相信这个问题与上述问题并不重复。

在我的控制器中执行以下代码时:

user = user_email.present? && User.find_by(email: user_email)

user 变量为User 模型保存active record object。因此执行user.valid_password? user_password 没有报错,测试成功。

但是当我尝试将&& 替换为and 时,结果非常令人惊讶。

当我尝试使用以下代码时:

user = user_email.present? and User.find_by(email: user_email)

user 变量持有boolean 值,因此执行user.valid_password? user_password出现以下错误:

未定义的方法`valid_password?'为真:TrueClass

谁能解释一下为什么会这样。

【问题讨论】:

  • 发生这种情况是因为and 的优先级低于分配。这同样适用于 Ruby 中的 or。正因为如此,这 2 种操作更像是控制结构而不是运算符,允许您执行 do_something() or fail 之类的操作,但对于新的 Ruby 程序员来说往往会感到困惑。

标签: ruby-on-rails ruby


【解决方案1】:

您的用户变量具有 TrueClass。 TrueClass 没有“valid_password”?方法。这就是您的代码发生这种情况的原因。

> a = true 
> a.valid_passowrd?
> undefined method `valid_password?' for true:TrueClass

为什么它必须有效?

【讨论】:

  • OP 已经知道 "user 变量包含一个布尔值",问题是“为什么?”。
  • 因为 TrueClass 类没有“valid_password”?方法所以为了解决这个问题我需要更多关于他的任务的信息
  • 问题已经解决了。感谢您的关心。
【解决方案2】:
user = user_email.present? and User.find_by(email: user_email)

被解释为:

(user = user_email.present?) and User.find_by(email: user_email)

present? 返回truefalse,分配给user

【讨论】:

  • 那么,如果我们使用and操作符,这意味着User.find_by(email: user_email)不会生效?
  • @SujitS 除非这条线是周围结构的一部分,否则它不会有任何效果。
  • 这是因为,正如一开始提到的,“=”的优先级高于“and”。 (user = user_email.present?) 并且评估在此停止,因为 = 具有更高的优先级。
猜你喜欢
  • 2013-07-03
  • 2013-02-17
  • 2013-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-18
  • 2010-12-22
  • 2011-02-17
相关资源
最近更新 更多