gpt4 book ai didi

ruby - 在 Ruby 中, 'new' 和 'initialize' 之间的关系是什么?初始化时如何返回nil?

转载 作者:数据小太阳 更新时间:2023-10-29 06:21:33 30 4
gpt4 key购买 nike

我想要的是:

obj = Foo.new(0)  # => nil or false

这行不通:

class Foo
def initialize(val)
return nil if val == 0
end
end

我知道在 C/C++/Java/C# 中,我们不能在构造函数中返回值。

但我想知道在 Ruby 中是否可行。

最佳答案

In Ruby, what's the relationship between 'new' and 'initialize'?

new 通常调用 initializenew 的默认实现类似于:

class Class
def new(*args, &block)
obj = allocate

obj.initialize(*args, &block)
# actually, this is obj.send(:initialize, …) because initialize is private

obj
end
end

当然,您可以覆盖它以执行任何您想要的操作。

How to return nil while initializing?

What I want is:

obj = Foo.new(0)  # => nil or false

This doesn't work:

class Foo
def initialize(val)
return nil if val == 0
end
end

I know in C/C++/Java/C#, we cant return a value in a constructor.

But I'm wondering whether it is possible in Ruby.

Ruby 中没有构造函数 这样的东西。在 Ruby 中,只有方法,它们可以返回值。

您看到的问题只是您想更改一个方法的返回值,但您正在覆盖另一个方法。如果您想更改方法 bar 的返回值,您应该覆盖 bar,而不是其他方法。

如果你想改变Foo::new的行为,那么你应该改变Foo::new:

class Foo
def self.new(val)
return nil if val.zero?
super
end
end

但是请注意,这是一个非常糟糕的想法,因为它违反了 new 的约定,即返回一个完全初始化、功能齐全的实例类。

关于ruby - 在 Ruby 中, 'new' 和 'initialize' 之间的关系是什么?初始化时如何返回nil?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10383535/

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