我是Ruby的新手,我遇到了一个我无法解决的问题。
我正在尝试使用gsub()
匹配字符串中的模式,然后将该匹配用作散列的索引。到目前为止,我还没弄清楚。这是一些代码:
farm = { "pig_num" => 5, "horse_num" => 2, "cow_num" => 4}
assessment = "There are 'pig_num' pigs on this farm"
assessment.gsub(/'(.+?)'/, '\1') # => "There are pig_num pigs on this farm"
assessment.gsub(/'(.+?)'/, farm) # => "There are pigs on this farm"
assessment.gsub(/'(.+?)'/, farm['\1']) # => TypeError: no implicit conversion of nil into String
assessment.gsub(/'(.+?)'/) { |key| farm[key] }
第一次调用gsub()
表示我正在匹配我想要的字符串。
第二个电话是尝试使用the Ruby documentation site处的gsub(pattern, hash)
风格。
第三个调用是尝试使用匹配作为索引来引用该值。
第四种是我认为可能使用lambda / proc / block工作的一些花哨的裤子。
我做错了什么?
答案 0 :(得分:2)
farm = { "pig_num" => 5, "horse_num" => 2, "cow_num" => 4}
assessment = "There are 'pig_num' pigs on this farm"
<强> 1 强>
“您可能希望从场哈希中获取第一个对象,但您需要告诉您要从哪个哈希值中检索值”。否则,您需要像上面一样使用Integer和String类型。
assessment.gsub(/'(.+?)'/, '1')
<强> 2 强>
当您'gsub'
字符串时,您会获得'pig_num'
,因为您在正则表达式中包含''
,因此结果为"'pig_num'"
。但是,哈希的关键是"pig_num"
。 "pig_num"
和"'pig_num'"
不同。这就是为什么你无法正确获取数据的原因。
assessment.gsub(/'(.+?)'/, farm)
第3 强> 你不能在blacket中指向索引但是哈希键
assessment.gsub(/'(.+?)'/, farm["pig_num"].to_s)
<强> 4 强>
正如我之前所说,你得到"'pig_num'"
作为关键。如果您打印出块内的键值,您将看到它。您需要将其更改为“纯密钥”。要删除引用,您可以再次使用gsub并使其为空而不是引用。 gsub!
是一种破坏性方法,意味着修改原始值。如果仅使用gusb
,则该方法返回修改后的值,但原始密钥本身(在这种情况下)不会更改。否则,您需要将新值分配给另一个变量。
assessment.gsub(/'(.+?)'/) { |key| p key.gsub!("\'", ""); farm[key] }
我希望这个答案对你有所帮助。干杯
答案 1 :(得分:1)
试试这个
assessment.gsub(/#{farm.keys.join('|')}/, farm)
答案 2 :(得分:0)
我在你的代码中看到正则表达式匹配它会识别'pig_num'
是在farm
哈希上找到的哈希键。所以你需要改变你的哈希值
farm = { "'pig_num'" => 5, "'horse_num'" => 2, "'cow_num'" => 4}
或者您可以更改正则表达式。实施例
farm = { "'pig_num'" => 5, "'horse_num'" => 2, "'cow_num'" => 4}
assessment.gsub(/'(.+?)'/, farm) # => "There are 5 pigs on this farm"
或者
farm = { "pig_num" => 5, "horse_num" => 2, "cow_num" => 4}
assessment.gsub(/pig_num/, farm) # => "There are '5' pigs on this farm"
答案 3 :(得分:0)
通过一些小的调整,您可以使用sprintf
的%{name}
或%<name>s
符号:
farm = { pig_num: 5, horse_num: 2, cow_num: 4 }
assessment = "There are '%{pig_num}' pigs on this farm"
sprintf(assessment, farm)
#=> "There are '5' pigs on this farm"