-2

シーケンスで呼び出す必要があるクラスにいくつかのインスタンス メソッドがあります。シーケンス内のいずれかのメソッドが失敗すると、前のメソッドを再度呼び出す必要があります。成功した各メソッド呼び出しの結果をクラス変数に格納しています。

class User
  @@auth_hash = {}
  def get_auth_token
    result = MyApi.get_new_auth_token(self) if @@auth_hash[self]['auth_token'].blank?
    if result['Errors']
      raise Exception, "You must reauthorize against the external application."
    else
      @@auth_hash[self]['auth_token'] = result['auth_token']
    end
    @@auth_hash[self]['auth_token']
  end
  def get_session_id
    result = MyApi.get_new_session_id if @@auth_hash[self]['session_id'].blank?
    if result['Errors']
      get_auth_token
      # Recursion
      get_session_id
    else
      @@auth_hash[self]['session_id'] = result['session_id']
    end
    @@auth_hash[self]['session_id']
  end
end

これらの条件を取り除きたいのですが、返されたハッシュにエラーがある場合にのみブロックを実行する方法がわかりません。

4

1 に答える 1

1

このメソッド全体を書き直す必要があります...しかし、あなたの質問に答えるには、なぜ次のように動作しないのでしょうか?

my_proc = ->(){ fill_me_with_something }
my_var ||= my_proc.call

raise StandardError if my_var.nil?

質問への回答を改善するために回答を編集しています...構文:

 my_proc  =   ->(a,b){ a + b } 

すべての意図と目的のために、ブロックを表現する別の方法です。

 my_proc(1, 5)   #=> 6

次の形式で Proc を表現することもできます。

 my_proc = Proc.new{ |a, b| a + b }

Proc を使用する利点は、ブロックのような動作を変数に設定し、必要なcallときにいつでもその proc を呼び出すことができることです。これは、この場合、他の変数が空白の場合です。

于 2013-10-10T20:37:35.433 に答える