gpt4 book ai didi

ruby - Ruby 中的 Open 类与 Groovy 中的 MOP 的作用域

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

我想知道的是,是否存在某种与我在 Groovy 中看到的 ExpandoMetaClasses 等价的东西? .我一直在阅读 Open Classes但我不太明白 Ruby 允许类修改的作用域级别。

借用上面博客中的一个例子,在 Groovy 中,我可以修改 Java 的 String 类并向其添加一个方法,如下所示:

String.metaClass.shout = {->
return delegate.toUpperCase()
}

println "Hello MetaProgramming".shout()

// output
// HELLO METAPROGRAMMING

而且我认为 Ruby 会让您重新定义该类并可能为它起别名(此时请帮助澄清我的误解):

class String
def foo
"foo"
end
end

puts "".foo # prints "foo"

在 Groovy 中,有一些方法可以将核心 Java 库方法的重新定义范围限定为单个实例或使用 Categories 的一组实例,这与我在 Ruby 中定义为 mixins 的感觉相似。

将开放类的范围限定到特定实例或模块子集的方法有哪些?

如果我要安装一个重新定义了一些核心类的 gem,是否只有该模块会受到影响,或者我包含该 gem 的任何 .rb 文件是否会受到影响?

提前为对 Ruby 和 Groovy 做出一些可能的假设表示歉意,我对这两者都是新手,但一直在努力寻找两者之间的等价物。

最佳答案

Ruby 的类永远不会“关闭”。所以当你说:

class String
def omg!
self.replace "OMG"
end
end

您正在 String 类上定义 omg! 方法。与需要使用特殊元类概念的 Groovy 不同,Ruby 类始终是开放的。

如果你想修改一组特定的字符串,你可以这样做:

module Magic
def presto
puts "OMG A HAT!"
end
end

class Array
include Magic
end

x = "Hello".extend(Magic)
puts x #=> Hello
x.presto #=> OMG A HAT!
[].presto #=> OMG A HAT!

def x.really?
true
end

x.really? #=> true

实际上,模块是可以添加到类或特定实例的方法的集合。

因此您可以直接打开一个类,也可以使用模块向类添加新方法。您还可以直接打开实例或使用模块向实例添加新方法。那是因为一个类只是 Class 的一个实例;)非常漂亮!

关于ruby - Ruby 中的 Open 类与 Groovy 中的 MOP 的作用域,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1061908/

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