要向Hash添加新对,我会:
{:a => 1, :b => 2}.merge!({:c => 3}) #=> {:a => 1, :b => 2, :c => 3}
Run Code Online (Sandbox Code Playgroud)
是否有类似的方法从哈希删除密钥?
这有效:
{:a => 1, :b => 2}.reject! { |k| k == :a } #=> {:b => 2}
Run Code Online (Sandbox Code Playgroud)
但我希望有类似的东西:
{:a => 1, :b => 2}.delete!(:a) #=> {:b => 2}
Run Code Online (Sandbox Code Playgroud)
重要的是返回值将是剩余的哈希值,因此我可以执行以下操作:
foo(my_hash.reject! { |k| k == my_key })
Run Code Online (Sandbox Code Playgroud)
在一条线上.
我对预期的RuntimeError有一个很大的问题:"在迭代期间无法将新密钥添加到哈希中"
在我的情况下,我有一个YAML文件:test.yaml - 我已经添加了一些键.
test.yaml
key1:
key2:
key3:
Run Code Online (Sandbox Code Playgroud)
我在变量中获取文件的内容:
file_hash = YAML.load_file("testm.yaml")
Run Code Online (Sandbox Code Playgroud)
然后我需要循环遍历此哈希并向其添加其他键:
file_hash.each do |key|
file_hash[key] = 'key_1'
file_hash[key] = 'key_2'
end
File.open('test.yaml', 'w') { |f| YAML.dump(file_hash, f) }
Run Code Online (Sandbox Code Playgroud)
主要问题是我在循环中无法写入哈希.当你有权控制循环块时,我不明白为什么会这样.还有另一种方法可以完成我上面展示的内容吗?
注意:我使用的是RUBY 1.9.3 p547
我有两个哈希数组:
a = [
{
key: 1,
value: "foo"
},
{
key: 2,
value: "baz"
}
]
b = [
{
key: 1,
value: "bar"
},
{
key: 1000,
value: "something"
}
]
Run Code Online (Sandbox Code Playgroud)
我想将它们合并到一个哈希数组中,所以基本上a + b除了我想要任何重复的键b来覆盖那些a.在这种情况下,无论是a和b包含的关键1,我想最终的结果具有b的键值对.
这是预期的结果:
expected = [
{
key: 1,
value: "bar"
},
{
key: 2,
value: "baz"
},
{
key: 1000,
value: "something"
}
]
Run Code Online (Sandbox Code Playgroud)
我得到了它的工作,但我想知道是否有一个不那么冗长的方式这样做:
hash_result = {}
a.each do |item| …Run Code Online (Sandbox Code Playgroud) 我正在阅读自信的红宝石,我正在尝试如何定义可重用的过程.从给出的例子中,我写道:
DEFAULT_BLOCK = -> { 'block executed' }
answers = {}
answers.fetch(:x, &DEFAULT_BLOCK)
Run Code Online (Sandbox Code Playgroud)
我期待它返回,block executed因为x在Hash中找不到它,而是返回它wrong number of arguments (given 1, expected 0) (ArgumentError).问题是什么?我还没有给出一个论点.
使用 ruby,如何对字母表中的每个字母(键)和 1-26(值)进行哈希?
我需要创建一个哈希,其中键为“a”到“z”,值为 1 到 26,但我不想自己编写alphabet = {'a'=>1,'b'=>2,....'y'=>25,'z'=>26}
我的代码中需要这个来打印alphabet[i] if alphabet.key?(i)
我有一个Hash,我想在深层插入一些数据,但任何级别的密钥都可能丢失.所以,我在每个级别更新它的值之前有条件地初始化它.
什么是更好的方式来编写这个或一种可以使代码不那么难看的方法?
data[:foo] ||= {}
data[:foo][:bar] ||= {}
data[:foo][:bar][:baz] ||= []
data[:foo][:bar][:baz] << 99
Run Code Online (Sandbox Code Playgroud) 我今天正在对旧代码进行一些审查,这出现了,如果提前道歉可能是一个愚蠢的问题,但是切片和提取之间有什么真正的区别!函数(对于哈希),我查看了文档,它们之间没有明显区别(至少对我而言):
也没有在社区上找到任何东西,提前谢谢。
我对 Ruby 有点陌生,并且在学习哈希时遇到了问题。我有一个哈希,其中包含本月内的几个月和几天。我需要打印每一个有 31 天的。
months = {
"MAR" => 31,
'APR' => 30,
'MAY' => 31,
'JUN' => 30
}
Run Code Online (Sandbox Code Playgroud) 在我正在学习的免费 Ruby 课程中,我了解了通过构造函数为哈希创建默认值的方法。它看起来像这样:
no_nil_hash = Hash.new("default value for nil key")
puts no_nil_hash["non_existing_key"]
Run Code Online (Sandbox Code Playgroud)
哪个打印:default value for nil key
我将如何通过哈希文字表示法来解决这个问题?
没有通过谷歌找到任何答案,这是迄今为止我徒劳的尝试:
via_hash_literal = {"default value for nil key"}但这会导致错误:syntax error, unexpected '}', expecting =>via_hash_literal = {=> "default value for nil key"}导致更多错误:
syntax error, unexpected =>, expecting '}' via_hash_literal = { => "default value for nil key"} syntax error, unexpected '}', expecting end-of-input ...=> "default value for nil key"}via_hash_literal = {nil => "default value for nil key"}不会引发错误,但 …我试图为目录上的每种扩展类型创建一个具有一个键的哈希值。我想为每个键添加两个值:重复扩展名的次数以及具有该扩展名的所有文件的总大小。
\n与此类似的东西:
\n{".md" => {"ext_reps" => 6, "ext_size_sum" => 2350}, ".txt" => {"ext_reps" => 3, "ext_size_sum" => 1300}}
但我\xc2\xb4m坚持这一步:
\nhash = Hash.new{|hsh,key| hsh[key] = {}}\next_reps = 0\next_size_sum = 0\n\nDir.glob("/home/computer/Desktop/**/*.*").each do |file|\n hash[File.extname(file)].store "ext_reps", ext_reps\n hash[File.extname(file)].store "ext_size_sum", ext_size_sum \nend\n\np hash\nRun Code Online (Sandbox Code Playgroud)\n得到这个结果:
\n{".md" => {"ext_reps" => 0, "ext_size_sum" => 0}, ".txt" => {"ext_reps" => 0, "ext_size_sum" => 0}}
我找不到增加ext_reps和的方法ext_siz_sum
谢谢
\n