Я пытаюсь выяснить, есть ли какая-то эквивалентность тому, что я вижу в Groovy как ExpandoMetaClasses . Я читал о открытых классах , но не могу понять, какой уровень видимости Ruby допускает модификации класса.
Заимствуя пример из блога выше, в Groovy я мог бы изменить класс String Java и добавить к нему метод следующим образом:
String.metaClass.shout = {->
return delegate.toUpperCase()
}
println "Hello MetaProgramming".shout()
// output
// HELLO METAPROGRAMMING
И я думаю , что Руби заставит вас переопределить класс и, возможно, присвоить ему псевдоним (пожалуйста, помогите прояснить мои недоразумения на этом этапе):
class String
def foo
"foo"
end
end
puts "".foo # prints "foo"
В Groovy есть способы распространения переопределения основных методов библиотеки Java на отдельные экземпляры или группу экземпляров с использованием категорий, что похоже на то, что я определил бы как миксины в Ruby.
Как можно использовать открытые классы для конкретных экземпляров или подмножеств модулей?
Если бы я должен был установить гем, в котором был переопределен какой-то базовый класс, затронул бы только этот модуль или на него повлиял бы любой файл .rb, в который я включил этот драгоценный камень?
Заранее извиняюсь за то, что сделал некоторые возможные предположения как для Ruby, так и для Groovy, я новичок в обоих, но пытаюсь найти эквивалентность между ними.