2015-09-16 69 views
2

根据this栈的问题,“和”与“&&”运营商在轨

and is the same as && but with lower precedence

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

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

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

user变量保存active record objectUser模型。因此执行user.valid_password? user_password没有发生错误,测试成功通过。

但是,当我试图用and代替&&时,结果令人惊讶。

当我试着用下面的代码:

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

user变量保存boolean价值,从而执行user.valid_password? user_password了以下错误:

undefined method `valid_password?' for true:TrueClass

任何人都可以请解释为什么会这样。

+1

发生这种情况是因为'和'比赋值低。这同样适用于Ruby中的'or'。正因为如此,那些2比控制结构更像操作符,允许你执行'do_something()或失败'等事情,但对于新的Ruby程序员经常会感到困惑。 – Borsunho

回答

7
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

+0

那么,这意味着'User.find_by(email:user_email)'如果我们使用'和'运算符不会起作用吗? – SujitS

+1

@SujitS它不会有任何作用,除非这条线是周围结构的另一部分。 – sawa

+0

这是因为,正如在开头提到的那样,“=”比“和”具有更高的优先级。 (user = user_email.present?)并且评估因此而停止,因为=具有更高的优先级。 –

-2

你的用户变量有TrueClass。 TrueClass没有“valid_password?”方法。这就是为什么它发生在你的代码。

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

为什么它必须起作用?

+2

OP已经知道*“'用户变量持有布尔值”*,问题是“为什么?”。 – Stefan

+0

Becouse类TrueClass没有“valid_password?”方法 所以要解决这个问题我需要更多关于他的任务的信息 – Alexandr

+0

问题已经解决了。感谢你的关心。 – SujitS