-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

你也可以用这种格式表达 Procs:

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

使用 Proc 的优点是您可以将类似块的行为设置为某个变量,然后call在需要时调用该 proc,在您的情况下,当某个其他变量为空时。

于 2013-10-10T20:37:35.433 回答