You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Ruby中基于条件为变量赋值函数的技术实现问询

嘿,我来帮你搞定这个Ruby代码的问题~

问题梳理

你想要实现的核心逻辑是:根据questions[:q1]的布尔值,动态选中对应的处理函数,然后遍历整个哈希时,统一用这个选中的函数处理每个键值对的value。不过你的现有代码存在几个小细节问题,我来帮你修正并解释清楚。

修正后的可运行代码

首先要注意,Ruby是解释型语言,方法必须在调用前定义,不然会报未定义方法的错误。另外调用赋值后的方法对象也有特定写法,修正后的代码如下:

# 先定义两个处理函数
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 }

# 根据q1的值选择要使用的函数(这里匹配你的预期:q1为false时调用true函数)
question_type = questions[:q1] == false ? question_type_true : question_type_false

# 遍历哈希,用选中的函数处理每个value
questions.each do |key, value|
  question_type.call(value)
end

运行这段代码后,就能得到你想要的预期输出:

"true function false"
"true function true"
"true function true"
关键细节解释
  • 方法定义顺序:必须先把question_type_truequestion_type_false放在代码最前面,不然Ruby解释到赋值语句时,会找不到这两个方法。
  • 函数调用方式:把方法赋值给变量后,需要用.call()(或者简写为.(value))来触发调用,这是Ruby中调用方法对象的正确姿势。
  • 匹配预期的判断逻辑:你的示例输入中q1: false但预期调用true函数,所以判断条件写成了questions[:q1] == false ? 选中true函数 : 选中false函数,如果后续需求变化,直接调整这个判断逻辑就行。
额外优化小技巧

如果以后需要扩展更多类型的处理函数,用哈希映射的方式会更直观易维护:

# 用哈希把布尔值和对应的方法绑定
function_map = {
  true: method(:question_type_true),
  false: method(:question_type_false)
}
# 直接通过键取值得到对应的函数
question_type = function_map[questions[:q1]]

甚至可以用lambda简化,不用单独定义全局方法:

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

function_map = {
  true: ->(question) { p "true function #{question}" },
  false: ->(question) { p "false function #{question}" }
}

question_type = function_map[questions[:q1]]
questions.each { |key, value| question_type.call(value) }

内容的提问来源于stack exchange,提问作者mariovzc

火山引擎 最新活动