gpt4 book ai didi

ruby - 全局符号上下文中的类与实例方法

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

我正在阅读一篇关于 Service Objects 的博文通过 Dave Copeland并遇到以下行:

A class in Ruby is a global symbol, which means that class methods are global symbols. Coding to globals is why we don’t use PHP anymore.

我想多了解一下这个陈述并有一些问题。

  • 类方法和实例方法在符号上下文中有何不同?

例如,采取以下 irb session :

irb(main):001:0> Symbol.all_symbols.grep /Foo/
=> []
irb(main):002:0> Symbol.all_symbols.grep /some.*method/
=> []
irb(main):003:0> class Foo
irb(main):004:1> def some_instance_method; end
irb(main):005:1> def self.some_class_method; end
irb(main):006:1> end
=> :some_class_method
irb(main):007:0> Symbol.all_symbols.grep /Foo/
=> [:Foo]
irb(main):008:0> Symbol.all_symbols.grep /some.*method/
=> [:some_instance_method, :some_class_method]
  • #some_instance_method::some_class_method 在符号上下文中有何不同?
  • 当我检查 Symbol.all_symbols 时我在做什么,这与查看“全局符号”是一回事吗?
  • 为什么同时显示 #some_instance_method::some_class_method?阅读以上引述后,我预计 008 的结果为:

    irb(main):008:0> Symbol.all_symbols.grep/some.*method/=> [:some_instance_method]

最佳答案

我认为 Dave 表达的方式有点不清楚,但他在您摘录后的段落中解释了影响:

A great example of where a service-as-a-global-symbol is problematic is Resque. All Resque methods are available via Resque, which means that any Ruby VM has exactly one resque it can use.

[…]

If, on the other hand, Resque was implemented as an object, instead of a global, any code that needed to access a different Resque instance would not have to change—it would just be given a different object.

不同之处在于接口(interface):使用 Resque,工具的用户“依赖于”特定类并与之交互——它们是对象,但它们是被降级为全局对象的对象。这与对象上的实例方法接口(interface)相反,在该接口(interface)中,任何其他对象都可以在不依赖对象类的情况下被替换。

因此,Dave 认为,在全局范围内使用类方法(就像一个无作用域的类定义)类似于使用全局方法,一种 la PHP。

关于ruby - 全局符号上下文中的类与实例方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43356638/

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