1

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

...但它很讨厌,而且看起来并不特别红宝石。有没有更惯用的方式来写这个?

4

3 回答 3

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 习惯用法。

于 2012-10-07T22:08:21.497 回答
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
于 2012-10-07T22:07:19.593 回答
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}
于 2012-10-08T01:40:48.757 回答