gpt4 book ai didi

ruby - 为什么这个 ruby​​ 代码不抛出异常?

转载 作者:太空宇宙 更新时间:2023-11-03 18:07:10 25 4
gpt4 key购买 nike

我正在学习 Bruce Tate 的七周学习七种语言,并尝试做所有的练习。有一个树练习,其中用户更改初始值设定项以接受散列并从中创建树。我最初的尝试如下:

def initialize(hash={})
if !hash.keys[0].nil?
@node_name = hash.keys[0]
@children = []
if !(hash.values[0].nil? or hash.values[0] == {})
hash.values[0].each do |k, v|
@children.push(Tree.new({k => v})
end
end
end
end

这行得通。但是,没有检查的代码也可以工作,即:

def initialize(hash={})
@node_name = hash.keys[0]
@children = []
hash.values[0].each do |k, v|
@children.push(Tree.new({k => v})
end
end

为什么不需要检查?似乎我会得到类似空引用的东西(我来自 .Net 背景,所以它可能在 ruby​​ 中被称为其他东西)。

这是我的完整代码:

class Tree
attr_accessor :children, :node_name

def initialize(hash={})
@node_name = hash.keys[0]
@children = []
hash.values[0].each do |k, v|
@children.push(Tree.new({k => v})
end
end

def visit_all(&block)
visit &block
children.each{|c| c.visit_all &block}
end

def visit(&block)
block.call self
end
end


ruby_tree = Tree.new({"grampa" => { "dad" => { "son1" => {}, "son2" => {}}, "uncle" => { "nephew1" => {}, "nephew2" => {"youngun1" => {}}}}})

puts "Visiting a node"
ruby_tree.visit {|node| puts node.node_name}
puts

puts "visiting entire tree"
ruby_tree.visit_all {|node| puts node.node_name}

最佳答案

如果您从此代码中删除 if 条件:

if !(hash.values[0].nil? or hash.values[0] == {})
hash.values[0].each do |v|
k = hash.key(v)
@children.push(Tree.new({k => v})
end
end

在这种情况下你可以得到一个异常(exception):

hash = {}
hash.values # => []
hash.values[0] # => nil

如果你在没有检查条件的情况下运行 each 循环,它将失败,因为 each 没有在 nil 上定义。

您的第二个条件 hash.values[0] == {} 可能会被完全跳过。

这只是防止 each 在空散列上循环的捷径,因为在它上面循环不会有任何效果。

hash = { foo: {} }
hash.values[0] # => {}

现在执行 {}.each 对输出没有影响。

关于ruby - 为什么这个 ruby​​ 代码不抛出异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42407991/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com