gpt4 book ai didi

ruby - 只是为了好玩 - 通过 block 向对象添加方法

转载 作者:数据小太阳 更新时间:2023-10-29 08:29:04 25 4
gpt4 key购买 nike

再次只是为了好玩,但是是否可以采用包含方法定义的 block 并将它们以某种方式添加到对象中?以下内容不起作用(我从没想过它会起作用),但只是为了让您了解我在玩什么。

我知道我可以用 class << existing_object 重新开课并以这种方式添加方法,但是有没有办法让代码在 block 中传递该信息?

我想我想在这里借用一点 Java 思想。

def new(cls)
obj = cls.new
class << obj
yield
end
obj
end

class Cat
def meow
puts "Meow"
end
end

cat = new(Cat) {
def purr
puts "Prrrr..."
end
}

cat.meow
# => Meow

# Not working
cat.purr
# => Prrrr...

编辑 |这是上面的工作版本,基于 edgerunner 的回答:

def new(cls, &block)
obj = cls.new
obj.instance_eval(&block)
obj
end

class Cat
def meow
puts "Meow"
end
end

cat = new(Cat) {
def purr
puts "Prrrr..."
end
}

cat.meow
# => Meow

cat.purr
# => Prrrr...

最佳答案

您可以使用 class_eval (也称为 module_eval )或 instance_eval 分别在类/模块或对象实例的上下文中评估 block 。

class Cat
def meow
puts "Meow"
end
end

Cat.module_eval do
def purr
puts "Purr"
end
end

kitty = Cat.new
kitty.meow #=> Meow
kitty.purr #=> Purr

kitty.instance_eval do
def purr
puts "Purrrrrrrrrr!"
end
end

kitty.purr #=> Purrrrrrrrrr!

关于ruby - 只是为了好玩 - 通过 block 向对象添加方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5973446/

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