rails中的“and”与“&&”运算符[重复]

Posted

技术标签:

【中文标题】rails中的“and”与“&&”运算符[重复]【英文标题】:"and" vs "&&" operator in rails [duplicate] 【发布时间】: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 程序员来说往往会感到困惑。 【参考方案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?) 并且评估在此停止,因为 = 具有更高的优先级。

以上是关于rails中的“and”与“&&”运算符[重复]的主要内容,如果未能解决你的问题,请参考以下文章

为啥||或者在rails中表现不同? [复制]

rails 常用方法

PHP中逻辑运算符and/or与||/&&的一个坑

与(and)&&

and, or, not 与 &&, ||, ! [关闭]

为啥短路不能防止与逻辑 AND (&&) 的不可达分支相关的 MissingMethodException?