[Ruby] 如何使用 select 方法搜索嵌套哈希

寻技术 Ruby编程 2023年07月09日 102

这次我想做什么

@drinks{:cola=>{:price=>120, :stock=>5},:redbull=>{:price=>200, :stock=>5},:water=>{:price=>100, :stock=>5}}
@slot_money = gets.to_i
  • 我想将上述哈希的 :price 值与@slot_money 进行比较,并创建一个仅包含可以购买的饮料的列表。此外,列表中仅显示库存项目。

基于安装条件的注意事项

  • 我想创建一个列表,所以我使用了一个返回列表的方法。
  • 既然要比较,看来有必要用一种可以搜索Hash内容的方法。
    => 查找、查找全部、选择等...?

暂时,select似乎满足条件,我们来实验一下。

关于选择方法

选择 -> 枚举器[永久链接][rdoc][编辑]
选择 {|key, value| ... } -> 哈希
过滤器 -> 枚举器
过滤器 {|key, value| ... } -> 哈希
评估键、值对的块并返回仅包含那些为真的对的散列。
如果没有给出块,则返回一个从自身和选择创建的 Enumerator 对象。
[使用示例]
h = { "a" => 100, "b" => 200, "c" => 300 }
h.select {|k,v| k > "a"} #=> {"b" => 200, "c" => 300}
h.select {|k,v| v < 200} #=> {"a" => 100}
引用:https://docs.ruby-lang.org/ja/latest/method/Hash/i/filter.html

  • 在官方参考中是如上描述的,所以暂时似乎有必要在{}中描述key和value。
@drinks.select{|drink, content| ...}

这是我绊倒的地方...
|饮料,内容|

但这里有一个启示。

“用p方法窥视里面。”

  • 这是生成的代码和结果。
irb:> @drinks.select{|drink, content| p drink}
:cola
irb> @drinks.select{|drink, content| p content}
{:price=>120, :stock=>5}
注:ここではHashの中身が増えるとわかりつらいため、ひとつだけ入れております。
  • 从结果可以看出,指定drink 时可以得到Cola,指定content 时可以得到{:price=>120, :stock=>5}。

这里又出现了一个火花。

“如果content的内容是Hash,是不是就不能通过content[:price]得到价格值?”

所以让我们去做吧。

irb> @drinks.select{|drink, content| p content[:price]}
120

我明白了~

  • 一旦你知道了这一点,剩下的就很容易了。让我们在select方法的条件部分描述搜索条件。

搜索条件是“我想通过比较 Hash 和 @slot_money 的 :price 值创建一个仅包含可购买饮料的列表。此外,仅显示列表中的库存产品。”

irb> @slot_money = 120 #120円お金を持っています。

irb> @drinks #@drinksにコーラとレッドブルと水を入れています。
=> 
{:cola=>{:price=>120, :stock=>5},
 :redbull=>{:price=>200, :stock=>5},
 :water=>{:price=>100, :stock=>5}}

irb> @drinks.select{|drink, content| content[:price] <= @slot_money 
&& content[:stock] > 0 }
=> {:cola=>{:price=>120, :stock=>5}, :water=>{:price=>100, :stock=>5}} 120円で買える商品のリストを取得できました。

我成功拿到名单了!

  • 如果仔细看清单,只能得到120日元可以买到的产品清单。
    红牛不在名单上,因为它是 200 日元,不能以 120 日元购买。

概括

  • 在这种情况下,关键部分是分配给嵌套哈希的键和值的部分。
    事实上,通过在检查键和值的同时进行验证,我们能够仅使用基本的 Hash 方法来检索值。

我想继续工作,同时经常检查变量的内容。

原创声明:本文系作者授权九品源码发表,未经许可,不得转载;

原文地址:https://www.19jp.com/show-308629511.html

关闭

用微信“扫一扫”