新手问题 这个 if a = b && c ... end 语法代表什么意思呢?

howiehu · 2013年06月28日 · 最后由 howiehu 回复于 2013年06月29日 · 6903 次阅读

如这段代码:

def self.new_with_session(params, session)
  super.tap do |user|
    if data = session['devise.googleapps_data'] && session['devise.googleapps_data']['user_info']
      user.email = data['email']
    end
  end
end

其中的:

if data = session['devise.googleapps_data'] && session['devise.googleapps_data']['user_info']
 user.email = data['email']
end

这个 if a = b && c ... end 语法是什么意思呢?

瞎猜 ing ... 判断 session['devise.googleapps_data'] 以及session['devise.googleapps_data']['user_info'] 都不是 nil 吧,顺便把 session['devise.googleapps_data'] 赋值给 data ?

#1 楼 @blacktulip 但是实际上赋值的是最后一个session['devise.googleapps_data']['user_info'],短路操作赋值最后一个成立的条件?

如果 a=b 赋值操作成功且 c 存在? 我猜的

#3 楼 @goinaction 赋值操作不可能失败的

测试了下 data = a && b 的执行顺序是 data = (a && b) 而不是 (data = a) && b 。这样就和 #2 楼 实际情况一致了。

data = (session['devise.googleapps_data'] && session['devise.googleapps_data']['user_info'])

这个首先是确保session['devise.googleapps_data']不是nil,然后就可以执行data = session['devise.googleapps_data']['user_info']这样的语句,最后,如果data不是nil,就可以使用data['email']来取得用户的 email 了。

检查 session['devise.googleapps_data'] 是否存在,如果存在,把 session['devise.googleapps_data']['user_info'] 赋值到 data,如果不存在,data 为 nil。

#5 楼 @blacktulip 你这动手一试提醒了我,其实自己用 console 试一下就 ok 了。

#8 楼 @yanhao 言简意赅,谢谢。

#4 楼 =的优先级不是应该比&&高吗,为啥会这样呢

=的优先级比 or、and 高,但比&&、||低。这个一定要小心哟。

额,看错了,=的优先级确实比&&低,基本只有 and or 这些排在=后面了

#12 楼 @yanhao #13 楼 @goinaction 又涨了一个经验哈哈哈!

这个如果是 ruby2.0 的话 可以写成 user.email = data['email'] if data = session['devise.googleapps_data'].to_h['user_info'] 简单明了了吧

我自己要写这种的话,肯定会加上括号。。。

&& 的结合性高于 = (和 C, Java, ... 一样) = 的结合性高于 and and 的结合性高于 if, unless, while, until

所以基本上不管怎样都能省掉括号...

需要 登录 后方可回复, 如果你还没有账号请 注册新账号