You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将传入方法的字符串参数作为Hash取值路径使用

问题修正与解决方案

你原代码里有两处笔误需要先修复:

  1. File.read(file) 中的 file 未定义,应该用方法入参 file_to_load
  2. 原逻辑里的 sections 变量也没有定义,属于无效代码

以下是两种可行的取值实现方案:


方案1:安全解析(推荐,无注入风险)

利用Ruby内置的Hash#dig方法,先把字符串路径解析为key序列再取值,完全不需要执行动态代码,适配符号key、数组数字索引等常规场景:

require 'json'

def do_the_thing(file_to_load, hash_path)
  file = File.read(file_to_load)
  data = JSON.parse(file, symbolize_names: true)

  # 把路径字符串拆解为dig方法可接收的key数组
  keys = hash_path.scan(/\[(:?[\w]+)\]/).map do |match|
    key = match.first
    if key.start_with?(':')
      key[1..-1].to_sym
    elsif key.match?(/^\d+$/)
      key.to_i
    else
      key.to_s
    end
  end

  # 安全取值,中间层级不存在时返回nil不会抛异常
  data.dig(*keys)
end

# 调用示例
result = do_the_thing(file_I_want, '[:foo][:bar][0]')

方案2:简易实现(仅内部可控场景使用)

如果你的使用场景完全可控,不存在恶意输入的可能,可以用instance_eval快速实现,但对外暴露的接口绝对禁止使用,存在代码注入风险:

require 'json'

def do_the_thing(file_to_load, hash_path)
  file = File.read(file_to_load)
  data = JSON.parse(file, symbolize_names: true)
  instance_eval("data#{hash_path}")
end

内容的提问来源于stack exchange,提问作者Sam O'Donnell

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 18:54:05