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?
返回true
或false
,分配给user
。
【讨论】:
那么,如果我们使用and
操作符,这意味着User.find_by(email: user_email)
不会生效?
@SujitS 除非这条线是周围结构的一部分,否则它不会有任何效果。
这是因为,正如一开始提到的,“=”的优先级高于“and”。 (user = user_email.present?) 并且评估在此停止,因为 = 具有更高的优先级。以上是关于rails中的“and”与“&&”运算符[重复]的主要内容,如果未能解决你的问题,请参考以下文章