gpt4 book ai didi

ruby - 类中的命名空间方法

转载 作者:行者123 更新时间:2023-12-04 16:52:32 24 4
gpt4 key购买 nike

我正在编写一个包装类来与 Clickup 的 API 集成,我想定义我的方法以匹配它们的其余 api 结构。所以我想如果我可以命名类中的方法会很酷,例如:

class Clickup

def initialize
# sets some variables e.g. api token
end

module Users

def get_all
# make call to get all users
end

end

module Lists

def get_all
# make call to get all lists
end

end
end
然后我可以像这样编写我的代码:
clickup = Clickup.new

@users = clickup::users.get_all
@lists = clickup::lists.get_all
问题是我不知道这是否可行以及如何调用模块内部的方法。
有谁知道如何做到这一点,或者有更好的方法来做到这一点?
理想情况下,我只想将 clickup 类设置一次,并且需要在类的根中设置的变量可以通过命名空间方法访问,例如api token 。

最佳答案

这真的不太可行。命名空间仅适用于类,而不适用于实例级别,因此 Clickup::Users会工作,但 Clickup.new::Users不能。您也许可以通过一些元编程来实现,但这会有点复杂,并且会使您的代码更难以理解。
不要误以为命名空间不止于此 - 命名空间。仅仅因为 A::B 将 B 嵌套在 A 中,并不意味着它们之间存在任何关系。它们具有完全独立的状态和行为。
以下是一种可能有效的类似方法,尽管它使您必须重写 initialize几次。不过,这可能是一件好事。这意味着每个类都独立工作,并且只能传入所需的依赖项。
请注意,我冒昧地将 4 空格缩进更改为 2,因为这是 Ruby 中的规范。

class Clickup   
def initialize(config)
@config = config
end

def users
Users.new(@config)
end

def lists
Lists.new(@config)
end

class Users
def initialize(config)
@config = config
end

def get_all
# make call to get all users
end
end

class Lists
def initialize(config)
@config = config
end

def get_all
# make call to get all lists
end
end
end
用法与您的想法相似:
clickup = Clickup.new(foo: "bar")
clickup.users.get_all # calls Users#get_all
clickup.lists.get_all # calls Lists#get_all
其实,我只是想起了一些事情... ::实际上是 . 的别名.这不是通常使用的东西,但从技术上讲,可以使用您想要的确切调用签名:
clickup = Clickup.new(foo: "bar")
clickup::users.get_all # calls Users#get_all
clickup::lists.get_all # calls Lists#get_all

关于ruby - 类中的命名空间方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67309279/

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