这样做有什么更好的方式呢?

时间:2012-10-07 21:58:34

标签: ruby oauth idioms

我正在检查某些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

...但它很讨厌,看起来并不特别红润。是否有更惯用的写作方式?

3 个答案:

答案 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}