将功能分配给有条件(Ruby)的变量



好吧,我有一个 question对象,如您所见,它会收到参数 true / false,我想要的是,在变量 question_type中,给定 questions[:q1]的值,它被分配为 question_type_truequestion_type_false能够在每个内部执行它。

questions = {
  q1: true,
  q3: true,
  q4: true,
  q5: true,
  q6: true,
  q7: true,
  q8: true
}
question_type = questions[:q1] == true ? question_type_true : question_type_false
questions.each do |key, value|
  question_type(value)
end

def question_type_true(question)
  p "true function #{question}"
end
def question_type_false(question)
  p "false function #{question}"
end

示例:

questions = { q1: false, q3: true, q4: true}

输出:

p "true function false"
p "true function true"
p "true function true

您只将方法的名称存储为符号

question_type = questions[:q1] ? :question_type_true : :question_type_false

然后 send您希望方法运行的对象的符号:

questions.each do |key, value|
  send question_type, value
end

您可以调用Object#method以获取对Method的引用,然后call IT:

question_type = questions[:q1] == true ? method(:question_type_true) : method(:question_type_false)
questions.each do |key, value|
  question_type.call(value)
end

请注意,您需要定义方法,然后才能调用method进行检索:

# works:
def some_method; end
method(:some_method)
# undefined method error:
method(:some_method)
def some_method; end

因此,您需要将方法定义移至给出的示例的顶部。

如果您需要的方法是某物上的实例方法,则可以通过在实例上调用method访问它:

o = Object.new
o.method(:nil?)

类似地,如果是类方法:

Object.method(:new)

最新更新