class 中的命名空间方法
Namespace methods inside class
我正在编写一个包装器 class 以与 Clickup 的 API 集成,我想定义我的方法以匹配它们的其余 api 结构。所以我在想,如果我可以在 class 中命名方法,那会很酷,例如:
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 class 一次,并且需要在 class 的根目录中设置变量,以便命名空间方法可以访问,例如api 令牌。
这真的不可行。命名空间仅在 class 上可用,在实例级别上不可用,因此 Clickup::Users
可以工作,但 Clickup.new::Users
不能。您也许可以通过一些元编程来实现,但这会有点复杂,并且会使您的代码更难以理解。
不要误以为名称space 不止于此 - 命名空间。仅仅因为 A::B 有 B 嵌套在 A 中,并不意味着它们之间有 任何 关系。它们具有完全独立的状态和行为。
以下是一种可能有效的类似方法,尽管它使您不得不重写 initialize
几次。不过,这可能是一件好事。这意味着每个 classes 独立工作,并且只能传入 必需的 依赖项。
注意,我冒昧地将 4-space 缩进更改为 2,因为这是 Ruby.[=18= 中的规范]
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
我正在编写一个包装器 class 以与 Clickup 的 API 集成,我想定义我的方法以匹配它们的其余 api 结构。所以我在想,如果我可以在 class 中命名方法,那会很酷,例如:
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 class 一次,并且需要在 class 的根目录中设置变量,以便命名空间方法可以访问,例如api 令牌。
这真的不可行。命名空间仅在 class 上可用,在实例级别上不可用,因此 Clickup::Users
可以工作,但 Clickup.new::Users
不能。您也许可以通过一些元编程来实现,但这会有点复杂,并且会使您的代码更难以理解。
不要误以为名称space 不止于此 - 命名空间。仅仅因为 A::B 有 B 嵌套在 A 中,并不意味着它们之间有 任何 关系。它们具有完全独立的状态和行为。
以下是一种可能有效的类似方法,尽管它使您不得不重写 initialize
几次。不过,这可能是一件好事。这意味着每个 classes 独立工作,并且只能传入 必需的 依赖项。
注意,我冒昧地将 4-space 缩进更改为 2,因为这是 Ruby.[=18= 中的规范]
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