在一个简单的示例/练习中获取Ruby语法错误

在一个简单的示例/练习中获取Ruby语法错误,ruby,Ruby,我是ruby的新手。下面是我的代码,我试图找到一个值为true的值,并将其放入值中。但是得到了错误 possible_values = [ 'ABC', 'DEF', 'GHI', 'JKL', 'MNO', 'PQR' ] options = { "environment"=>"dev", "status"=>

我是ruby的新手。下面是我的代码,我试图找到一个值为true的值,并将其放入
值中。但是得到了错误

possible_values =
    [
      'ABC',
      'DEF',
      'GHI',
      'JKL',
      'MNO',
      'PQR'
    ]
    
options = {
    "environment"=>"dev", 
    "status"=>"valid", 
    "abc"=>true, 
    "def"=>true, 
    "ghi"=>false, 
    "jkl"=>false
    }

options['values'] = []
possible_values.each do |val|
    options['values'] << val if options[val.downcase]
    options.delete("val") 
end

puts "values: #{options['values'}"
三个错误:

  • 您的
    put
    行缺少
    ]
  • 放置“值:{options['values'}”
    #^应该在这里
    
  • 您希望在处理后删除
    选项
    键,但总是删除
    “val”
  • 选项。删除(“val”)
    #^^额外的引号使其成为“val”字符串
    
  • 同样,您希望在处理后删除
    选项
    键。
    可能的\u值
    都是大写的,如果没有
    小写
    ,删除时将与
    选项
    中的对应键不匹配。将#2和#3放在一起,您需要的是:
    选项。删除(val.downcase)
  • 修复所有这三个选项后,以下是
    选项的内容:

    {“环境”=>“开发”、“状态”=>“有效”、“值”=>[“ABC”、“定义”]}
    
    这似乎是您想要的

    我知道您希望变异(修改)
    选项
    ,而不是返回单独的散列,保持
    选项
    不变

    我倾向于编写如下代码,部分是为了方便在计算了
    true\u键之后测试
    true\u键
    选项
    (如下)

    true_keys = options.keys.each_with_object([]) do |k,arr|
      case options[k]
      when true
        arr << k.upcase
        options.delete(k)
      when false
        options.delete(k) 
      end
    end
      #=> ["ABC", "DEF"]
    
    注意,我们不能写

    true_keys = options.each_key.each_with_object([]) do |k,arr|...
    

    因为这会在交互过程中删除
    选项
    的元素,所以在迭代
    选项.keys
    时,这不是问题

    还有一步:

    options.tap { |h| h['values'] = true_keys & possible_values }
      #=> {"environment"=>"dev", "status"=>"valid", "values"=>["ABC", "DEF"]}
    

    只是检查一下:

    options
      #=> {"environment"=>"dev", "status"=>"valid", "values"=>["ABC", "DEF"]}
    
    你也可以写

    options.update('values'=>true_keys & possible_values)
      #=> {"environment"=>"dev", "status"=>"valid", "values"=>["ABC", "DEF"]}
    
    请参阅(也称为“合并”


    如果
    选项
    可能的_值
    较大,则作为初始步骤将
    可能的_值
    转换为集合是明智的,因为集合查找比数组查找快得多,后者需要线性搜索。这只会影响
    点击
    (或
    更新
    )操作

    require 'set'
    
    possible_values_set = possible_values.to_set
      #=> #<Set: {"ABC", "DEF", "GHI", "JKL", "MNO", "PQR"}>
    
    tap
    表达式将变为:

    options.tap do |h|
      h['values'] = true_keys.select { |k| possible_values_set.include?(k) }
    end
      #=> {"environment"=>"dev", "status"=>"valid", "values"=>["ABC", "DEF"]}
    

    我认为你的插值是关闭的。你缺少了一个右结束括号?你的看跌期权不应该是这样的:
    看跌期权“值:{options['values']}”
    如果
    选项
    包含
    “xyx”=>true
    ,你想要什么=>false
    ?我无法重现您的问题。我甚至无法运行您的代码,我在解析时得到一个
    SyntaxError
    。似乎您发布了错误的代码,因为您发布的代码不可能产生您发布的错误。请提供一个能够准确重现您所遇到的实际问题的示例。所有这些都无法修复OP的问题lem“无法将字符串转换为整数(TypeError)”。事实上,OP的代码首先不可能导致该错误!(实际上,OP的代码根本不会导致运行时错误,因为它在语法上无效,因此永远无法运行。)因此,很明显,问题出在OP没有向我们展示的代码中。初学者提出错误的问题是很常见的。如果你帮助并修复了这个问题,它会更有建设性。OP发布了错误的代码。问题中的代码不可能产生错误。甚至忽略代码中的语法错误。有人支持吗如果产生错误的代码丢失,是否提出修复错误?
    options.update('values'=>true_keys & possible_values)
      #=> {"environment"=>"dev", "status"=>"valid", "values"=>["ABC", "DEF"]}
    
    require 'set'
    
    possible_values_set = possible_values.to_set
      #=> #<Set: {"ABC", "DEF", "GHI", "JKL", "MNO", "PQR"}>
    
    true_keys
      #=> ["ABC", "DEF"]
    
    options.tap do |h|
      h['values'] = true_keys.select { |k| possible_values_set.include?(k) }
    end
      #=> {"environment"=>"dev", "status"=>"valid", "values"=>["ABC", "DEF"]}