【发布时间】:2013-10-18 17:31:30
【问题描述】:
我在一个类中有一些实例方法必须按顺序调用。序列中任何方法的失败都需要重新调用之前的方法。我将每个成功的方法调用的结果存储在一个类变量中:
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
我想摆脱这些条件,但不知道如何仅在返回的哈希中存在错误时执行块。
【问题讨论】:
-
看起来
get_session_id的第一行如果满足你的条件就会产生无限递归——实际上是这样写的吗? -
我只是拼凑这些来模拟我真正拥有的东西,但是如果 result['Errors'] 为 nil,则条件将不会执行。
-
@@auth_hash到底是什么?使用类变量通常表明您的设计有问题。您是否在这里将其用作某种缓存?这通常会适得其反,缓存只适用于一个进程,其中通常有很多,而且你这里没有失效代码。 -
@AKWF 你考虑过 Zach Kemp 的评论吗?这种无限递归似乎没用。
-
result => nil当if @@auth_hash[self]['session_id'].blank? => false。你想要那个吗?如果没有,请解决这个问题,我们也许可以提供帮助。
标签: ruby conditional idioms