如这段代码:
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'],短路操作赋值最后一个成立的条件?
测试了下 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。
这个如果是 ruby2.0 的话 可以写成
user.email = data['email'] if data = session['devise.googleapps_data'].to_h['user_info']
简单明了了吧
&& 的结合性高于 = (和 C, Java, ... 一样) = 的结合性高于 and and 的结合性高于 if, unless, while, until
所以基本上不管怎样都能省掉括号...