我正在检查某些oAuth值的会话哈希值,然后在它们不存在时设置它们。这是我现有的代码:
unless session[:oauth][:request_token].nil? && session[:oauth][:request_token_secret].nil?
@request_token = OAuth::RequestToken.new(@client, session[:oauth][:request_token], session[:oauth][:request_token_secret])
end
...但它很讨厌,看起来并不特别红润。是否有更惯用的写作方式?
答案 0 :(得分:4)
也许只是使用一些变量?
oauth = session[:oauth]
token, secret = oauth.values_at :request_token, :request_token_secret
if token && secret
@request_token = OAuth::RequestToken.new(@client, token, secret)
end
请注意,我已将unless obj.nil?
替换为if obj
,因为nil
无论如何都是假的。除非您希望将false
作为有效值,否则这是典型的Ruby习惯用法。
答案 1 :(得分:2)
我写道:
oauth = session[:oauth]
if (token = oauth[:request_oken]) && (secret = oauth[:request_token_secret)
@request_token = OAuth::RequestToken.new(@client, token, secret)
end
或者:
token, secret = session[:oauth].values_at(:request_token, :request_token_secret)
@request_token = OAuth::RequestToken.new(@client, token, secret) if token && secret
答案 2 :(得分:0)
另一种方式:
session[:oauth].tap do |h|
[h[:request_token], h[:request_token_secret]].tap do |t1, t2|
@request_token = OAuth::RequestToken.new(@client, t1, t2) if t1 and t2
end
end
实际上,我会使用我定义的以下方法并且通常用于我自己。
class Object
def chain ≺ pr.call(self) end
end
然后,你可以避免嵌套,代码会更好一点:
session[:oauth]
.chain{|h| [h[:request_token], h[:request_token_secret]]}
.tap{|t1, t2| @request_token = OAuth::RequestToken.new(@client, t1, t2) if t1 and t2}