ruby - 有人可以解释这种“将元素添加到集合”方法的工作原理吗?
问题描述
我是 Ruby 新手,正在做一些编码练习。这是给定的提示:
Ruby 在其标准库中提供了一个名为 Set 的类。让我们创建一组方法来像操作 Set 一样操作 Hash。像这样:
请注意,这些应该是安全的方法(不!)
set_add_el({}, :x) # => {:x => true}
set_add_el({:x => true}, :x) # => {:x => true} # This should automatically work if the first method worked
set_remove_el({:x => true}, :x) # => {}
等等......我还需要实现一些其他方法。但我只是想开始,也许我没有完全理解这个问题。功能标题后面的注释是什么意思?为了帮助我进一步说明我的问题,我在网上找到了第一种方法的解决方案:
def set_add_el(set, value)
if set[value].nil?
set[value] = true
end
return set
end
首先,我认为问题是要求操纵散列,使其表现得像一个数学集。我很困惑,因为上面的函数似乎需要一个数组作为输入。其次,我运行了这段代码,但它似乎没有做它应该做的事情。我尝试将 ([3,4,5], 6) 和 ([3,4,5], 4) 作为参数传入。我希望第一个返回 [3,4,5,6],第二个返回 [3,4,5],因为在一个集合中不应该有重复。前者的输出返回 [3, 4, 5, nil, nil, nil, true] 这对我来说毫无意义。
解决方案
您被要求展示如何使用散列来模拟集合,其中散列的所有键都具有相同的值true
。稍后我将解决哈希值的问题。
集合和散列的关键共同属性是集合具有唯一值,而散列具有唯一键。
虽然给你的措辞不是很清楚,但我相信你被要求写两种方法,
def set_add_el(hash, obj)
...
end
和
def set_remove_el(hash, obj)
...
end
其中第一个是并行方法Set#add。你要证明你的方法set_add_el
方法满足这两个属性:
set_add_el({}, :x) #=> { :x => true }
set_add_el({:x => true}, :x) #=> { :x => true }
后一种方法是并行方法Add#delete并且必须满足:
set_remove_el({:x => true}, :x) #=> {}
当您使用它时,您可能希望表明您的方法具有与集合类似的其他属性,例如以下。
set_add_el({:x => true}, :y) #=> { :x => true, :y => true }
set_remove_el({:x => true}, :y) #=> { :x => true }
方便时,可以使用Set#to_aset
方法将 a 映射到其元素的数组中:set.to_a
. 哈希的可比较方法是Hash#keys:返回用于模拟集合h.keys
的哈希键的数组。h
虽然已经指出哈希值适用true
于所有键,但它们显然可以是任何对象。例如,它们可能都不同,也nil
可能都不同。如果要添加h
哈希和:x
密钥,甚至可以写h[:x] = ['dog', 'cat', 'pig'].sample
. 如果h #=> { :x => 'dog' }
, 并且h[:x] = 'cat'
, 那么h #=> { :x => 'cat' }
. 因此,虽然使用不同的值会改变散列,但它不会改变键,而且我们只对 感兴趣h.keys
,这不是问题。
推荐阅读
- r - R-跳过特定列中的空行
- json - 从 powershell 执行 PATCH api 调用
- java - Java.lang.NoSuchFieldError:类“Ljava/lang/Integer”中没有“I”字段“值”;或其超类
- microsoft-graph-api - Azure AD B2C 使用 Graph API 创建社交帐户 创建用户
- javascript - 传递空参数、null 或 undefined 哪个更可靠?(同时期待一个功能)
- ajax - 我应该发出多个 Ajax 请求还是合并为一个
- ios - CNContactViewController 丢弃消息 Xamarin
- c - strtoul 意外的十六进制转换
- microsoft-graph-sdks - 无法创建组,范围无效
- json - 处理同一路由的不同响应类型 -Flutter