gpt4 book ai didi

ruby - 什么标准证明在 Ruby 中使用模块而不是类?

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

我正在阅读我的 ruby 书。查看下面的代码,

module Destroy
def destroy(anyObject)
@anyObject = anyObject
puts "I will destroy the object: #{anyObject}"
end
end

class User
include Destroy
attr_accessor :name, :email
def initialize(name,email)
@name = name
@email = email
end
end

my_info = User.new("Bob","Bob@example.com")
puts "So your name is: #{my_info.name} and you have email #{my_info.email}"

user = User.new("john","john@example.com")
user.destroy("blah")

我本可以在我的类中创建另一个方法。我为什么要这样做?我为什么要使用模块?将它嵌入到其他类中并不比使用普通继承更容易。

最佳答案

您可以将模块及其内部的方法和常量视为更多地提供实用功能和操作,您可以根据需要将这些功能和操作包含到其他对象中。例如,如果你想在对象 FooBar 中使用 destroy 函数,你可以做类似的事情:

class Foo
include Destroy
# other code below
end

class Bar
include Destroy
# other code below
end

现在任何 FooBar 对象都可以访问 destroy 中的所有方法或常量。

模块定义了一个命名空间,一个沙盒,您的方法和常量可以在其中发挥作用,而不必担心被其他方法和常量踩到。 ruby docs对此进行了更深入的介绍,并提供了一个很好的实用示例,说明您何时想使用它,如下所示:

module Debug
def whoAmI?
"#{self.type.name} (\##{self.id}): #{self.to_s}"
end
end
class Phonograph
include Debug
# ...
end
class EightTrack
include Debug
# ...
end
ph = Phonograph.new("West End Blues")
et = EightTrack.new("Surrealistic Pillow")
ph.whoAmI? » "Phonograph (#537766170): West End Blues"
et.whoAmI? » "EightTrack (#537765860): Surrealistic Pillow"

在此示例中,包含 Debug 的每个类都可以访问方法 whoAmI? 以及 Debug 包含的其他方法和常量,而无需为每个类重新定义它。

关于ruby - 什么标准证明在 Ruby 中使用模块而不是类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38155304/

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