gpt4 book ai didi

Ruby 定义了吗?( 42[0][ :foo] ) && defined? ( 93[0] ["bar"] ) == true。为什么?

转载 作者:数据小太阳 更新时间:2023-10-29 07:28:40 27 4
gpt4 key购买 nike

短篇小说:

“为什么 defined?(59[0][:whatever]) 的计算结果为真?”


长话短说:

我最近遇到了一些奇怪的行为,这让我很生气。

我正在开发一种对数据进行一些清洗的方法:

#Me washing input data:
def foo(data)
unless data && defined?(data[0]) && defined?(data[0][:some_param])
method2(data[0][:some_param])
else
freak_out()
end
end

我通常会在编写测试时输入各种垃圾数据,以确保不会发生任何异常情况:

describe "nice description" do
it "does not call method2 on junk data" do
expect(some_subject).to_not receive(:method2)
random_junk_data_array.each do |junk|
some_subject.foo(junk)
end
end
end

嗯,这里调用了method2。它发生在 junk 是一个 fixnum 的时候。

我正在使用 ruby 2.1.0,我可以看到 Fixnum 有一个 #[] 方法,它在那个位置获取位位置不错。

但为什么 fixnum[0][:some_param] 被认为是 defined

最佳答案

defined? expression tests whether or not expression refers to anything recognizable (literal object, local variable that has been initialized, method name visible from the current scope, etc.). The return value is nil if the expression cannot be resolved. Otherwise, the return value provides information about the expression.

让我用一个例子来解释:-

defined?("a") # => "expression"
# this returns "method", as there is a method defined on the class String. So, the
# method invocation is possible, and this is a method call, thus returning `"method"`.
defined?("a".ord) # => "method"
# it return nil as there is no method `foo` defined on `"a"`,
# so the call is not possible.
defined?("a".foo) # => nil

现在进入你的观点:-

正如您所说,data[0] 提供了一个 Fixnum 实例,当然还有 Fixnum#[]存在。因此 fixnum_instance[:some_param] 也是一个有效的方法调用。它只是测试方法是否已定义。如果已定义,它会告诉 这是一个 “方法” 表达式。否则 nil。实际上不会检查方法调用是否成功。

在 Ruby 中,除了 nilfalse 之外,所有对象都有 truthy 值,因此 "method" 是一个字符串对象也有 truthy 值,因此你的条件成功了。

关于Ruby 定义了吗?( 42[0][ :foo] ) && defined? ( 93[0] ["bar"] ) == true。为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23634767/

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