如这段代码:
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
所以基本上不管怎样都能省掉括号...