gpt4 book ai didi

ruby - 将模块包含到方法 ruby​​ 中

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

我已经使用模块来扩展类功能。但是突然我想知道如果我直接将模块包含到类的方法中而不是像这样包含到类中是否可以:

原始用途:

型号:

class Baby
include CommunicationSkills

def initialize(name)
@name = name
end
end

模块:

module CommunicationSkills
def greet
"Hi"
end
end

所以我们可以:

ivan = Baby.new('Iván')
ivan.greet
=> "Hi"

但是如果我直接将方法包含在方法中会怎么样:

class Baby

def initialize(name)
@name = name
end

def greet(language)
extend GreetLanguages
send(language)
end
end

模块:

module GreetLanguages
def spanish
"Hola"
end

def english
"Hi"
end
end

所以:

ivan = Baby.new('Iván')
ivan.greet('spanish')
=> "Hola"
ivan.greet('english')
=> "Hi"

我知道这是可能的,但从概念上讲它是正确的吗?

最佳答案

该模块包含两个实例方法。您希望将它们发送到一个实例,而不是类,因此您需要包含 模块(使用 Module#include ),而不是扩展它。要从实例方法(self 是实例)中调用 include,您必须将 include 发送到 self.class。因此,您需要编写以下内容。

class Baby
def initialize(name)
@name = name
end
def greet(language)
self.class.include GreetLanguages
send(language)
end
end

ivan = Baby.new('Iván')
ivan.greet('spanish')
#=> "Hola"

Baby.instance_methods.include?(:english) && Baby.instance_methods.include?(:spanish)
#=> true

ivan.greet('english')
#=> "Hi"

您也可以编写 ivan.greet(:spanish)

您将使用 Object#extend如果您想在将它们引入类时将模块中的实例方法转换为类方法。

class Baby
def initialize(name)
@name = name
end
def extend_mod
self.class.extend GreetLanguages
end
end

Baby.new('Iván').extend_mod
Baby.methods.include?(:spanish) && Baby.methods.include?(:english) #=> true

Baby.spanish
#=> "Hola"
Baby.english
#=> "Hi"

在实例方法中调用includeextend 是不常见的。我不知道为什么有人要这样做。

关于ruby - 将模块包含到方法 ruby​​ 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39627142/

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