gpt4 book ai didi

ruby - "public/protected/private"方法是如何实现的,我该如何模拟它?

转载 作者:数据小太阳 更新时间:2023-10-29 07:12:19 26 4
gpt4 key购买 nike

在 ruby 中,你可以这样做:

class Thing
public
def f1
puts "f1"
end

private
def f2
puts "f2"
end

public
def f3
puts "f3"
end

private
def f4
puts "f4"
end
end

现在 f1 和 f3 是公共(public)的,f2 和 f4 是私有(private)的。内部发生了什么,允许您调用一个类方法,然后更改方法定义?我怎样才能实现相同的功能(表面上是创建我自己的 java 之类的注释)

例如...

class Thing
fun
def f1
puts "hey"
end

notfun
def f2
puts "hey"
end
end

fun 和 notfun 将更改以下函数定义。

谢谢

最佳答案

有时您可以将 Ruby 插入浓缩咖啡杯中。让我们看看如何。

这是一个模块 FunNotFun...

module FunNotFun

def fun
@method_type = 'fun'
end

def notfun
@method_type = 'not fun'
end

def method_added(id)
return unless @method_type
return if @bypass_method_added_hook
orig_method = instance_method(id)
@bypass_method_added_hook = true
method_type = @method_type
define_method(id) do |*args|
orig_method.bind(self).call(*args).tap do
puts "That was #{method_type}"
end
end
@bypass_method_added_hook = false
end

end

...您可以用来扩展一个类...

class Thing

extend FunNotFun

fun
def f1
puts "hey"
end

notfun
def f2
puts "hey"
end
end

...结果如下:

Thing.new.f1
# => hey
# => That was fun

Thing.new.f2
# => hey
# => That was not fun

但请参阅下面的行以获得更好的方法。


注解(请参阅 normalocity 的回答)不那么麻烦,并且作为一种常见的 Ruby 惯用语,将更容易传达代码的意图。以下是使用注释的方法:

module FunNotFun

def fun(method_id)
wrap_method(method_id, "fun")
end

def notfun(method_id)
wrap_method(method_id, "not fun")
end

def wrap_method(method_id, type_of_method)
orig_method = instance_method(method_id)
define_method(method_id) do |*args|
orig_method.bind(self).call(*args).tap do
puts "That was #{type_of_method}"
end
end
end

end

在使用中,注解出现在方法定义之后,而不是之前:

class Thing

extend FunNotFun

def f1
puts "hey"
end
fun :f1

def f2
puts "hey"
end
notfun :f2

end

结果是一样的:

Thing.new.f1
# => hey
# => That was fun

Thing.new.f2
# => hey
# => That was not fun

关于ruby - "public/protected/private"方法是如何实现的,我该如何模拟它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7747325/

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