访问变量名称

时间:2016-05-24 23:54:00

标签: ruby

我尝试在Rails之外进行一些参数验证。

def create_statement(action, ...)
  valid_one_of(action, ['ADD', 'MOVE', 'DELETE'])
  ...
end

验证方法:

def valid_one_of(input, valid_values)
  return true if valid_values.include?(input)
  raise "#{input} was not a valid value for #{input.var_name}" 
end

示例电话:

create_statement('Bob')

所以输出结果为:

Bob was not valid value for action

问题我如何获得 input.var_name

我可以传递

的解决方法
valid_one_of(action, ['ADD', 'MOVE', 'DELETE'], 'action')

(并使用第三个parm作为我的输出),但这似乎并不是多余的。

如果无法访问变量名,那么DRY编码风格是否比此变通方法更多?

1 个答案:

答案 0 :(得分:0)

我不知道如何获取局部变量的名称,即使你可以,你想要哪个名字?方法定义中定义的参数名称?调用者中变量的名称?

我不认为你的“解决方案”是那么可怕,但我可以提出一些可能会稍微好一点的微小变化。

此外,我不确定您的意图是否实际传入呼叫站点上的有效值列表,或者如果您可能有,请说一个有效值的哈希,您可以使用传入的类型来查找有效值来自。

def valid_one_of_type type, input:, valid_values:
  return true if valid_values.include?(input)
  raise "#{input} was not a valid value for #{type}" 
end

my_action = "bob"

valid_one_of_type :action , input: my_action, valid_values: ['ADD', 'MOVE', 'DELETE'] 

def valid_one_of_type type, input, valid_values
  return true if valid_values.include?(input)
  raise "#{input} was not a valid value for #{type}" 
end

my_action = "bob"

valid_one_of_type :action , my_action, ['ADD', 'MOVE', 'DELETE'] 

另一个选择是将您的操作包装在一个类中并在创建时进行验证:

class Action 
  VALID_ACTIONS = ['ADD', 'MOVE', 'DELETE']
  def initialize action
    unless VALID_ACTIONS.include? action 
      raise "#{action} is not a valid value for #{self.class.name}"
    end
  end
end

my_action = Action.new "bob"