Tag: 元编程

respond_to和respond_to_missing有何不同?

我很困惑何时使用这些方法。 来自respond_to? 文档: 如果obj响应给定方法,则返回true。 仅当可选的第二个参数的计算结果为true时,才会在搜索中包含私有方法。 如果未实现该方法,如Windows上的Process.fork,GNU / Linux上的File.lchmod等,则返回false。 如果没有定义方法,则response_to_missing? 调用方法并返回结果。 并且respond_to_missing? : Hook方法返回obj是否可以响应id方法。 见#respond_to?。 两种方法都有2个参数。 两种方法似乎都是一样的(检查某个对象是否响应给定的方法)所以为什么我们应该使用(have)两者? 定义’resond_to_missing?`让你有能力采取方法: class A def method_missing name, *args, &block if name == :meth1 puts ‘YES!’ else raise NoMethodError end end def respond_to_missing? name, flag = true if name == :meth1 true else false end end end [65] pry(main)> A.new.method :meth1 […]

扩展模块中的类方法

我正在玩ruby的元编程function,我发现它有点毛茸茸。 我正在尝试使用模块包装方法调用。 目前,我这样做: module Bar module ClassMethods def wrap(method) class_eval do old_method = “wrapped_#{method}”.to_sym unless respond_to? old_method alias_method old_method, method define_method method do |*args| send old_method, *args end end end end end def self.included(base) base.extend ClassMethods end end class Foo include Bar def bar(arg = ‘foo’) puts arg end wrap :bar end 三个问题: 有没有办法在不重命名方法的情况下这样做,以便允许使用super ? […]

以编程方式从字符串派生正则表达式

我想输入一个字符串并返回一个可用于描述字符串结构的正则表达式。 正则表达式将用于查找与第一个相同结构的更多字符串。 这是故意模棱两可的,因为我肯定会错过SO社区中的某个人会抓住的案例。 请发布任何和所有可能的方法来执行此操作。

如何将方法动态定义为私有?

这似乎不起作用: class Test private define_method :private_method do “uh!” end end puts Test.new.private_method

在Ruby中动态定义命名类

我正在用Ruby编写内部DSL。 为此,我需要以编程方式创建命名类和嵌套类。 这样做的最佳方法是什么? 我认为有两种方法可以做到这一点: 使用Class.new创建一个匿名类,然后使用define_method向其添加方法,最后调用const_set将它们作为命名常量添加到某个命名空间。 使用某种eval 我已经测试了第一种方式并且它有效,但是对Ruby来说是新手,我不确定将类作为常量放置是正确的方法。 还有其他更好的方法吗? 如果没有,上述哪一项更可取?

猴子补丁vs class_eval?

class String def hello “world” end end String.class_eval { def world “hello” end } “a”.world => “hello” “b”.hello => “world” 他们似乎做了同样的事情 – 向现有类添加方法。 那有什么区别?

define_method:如何使用参数动态创建方法

我想为find_byfunction创建一堆方法。 我不想一遍又一遍地写同样的东西所以我想使用元编程。 假设我想创建一个按名称查找的方法,接受名称作为参数。 我该怎么办? 我过去使用过define_method但是我没有任何关于该方法的参数。 这是我(坏)的方法 [“name”, “brand”].each do |attribute| define_method(“self.find_by_#{attribute}”) do |attr_| all.each do |prod| return prod if prod.attr_ == attr_ end end end 有什么想法吗? 提前致谢。

获取通过`attr_accessor`定义的所有变量,而不覆盖`attr_accessor`

我正在我的程序上设置一些跟踪代码,并想知道通过attr_accessor定义了哪些方法。 使用TracePoint ,我可以检测到何时attr_accessor ,但我不知道如何让它告诉我它收到的参数。 有任何想法吗?

了解class方法的method_added

我想在瞬间做一些魔术,并将类方法添加到某个类中。 因此我尝试了以下方法: module Magic def self.included(base) base.extend ClassMethods end module ClassMethods def method_added(name) puts “class method ‘#{name}’ added” end def some_class_method puts “some class method” end end end class Foo include Magic def self.method_added(name) puts “instance method #{name} added” end end 这种方法适用于实例方法,类方法失败。 我怎么解决这个问题? 有什么建议?

Ruby 2.0如何在包含模块后从模块中取出模块?

module X end module Y end module Z #TODO include X replacement of including Y #TODO include Y replacement of including X end 有没有办法解决ruby不包含uninclude关键字的事实?