在Ruby模块中,如何测试使用该模块的上下文中是否存在方法?

时间:2018-07-01 15:31:25

标签: ruby reflection dsl

某些上下文

我正在与Ruby一起玩耍,以加深我的知识并从中获得乐趣,同时通过一个刚开始的玩具项目 Ĝue 来提高我对世界语的了解。基本上,目标是使用Ruby工具来实现与我认为在编程语言的上下文中有趣的世界语特征相匹配的DSL。

实际问题

因此,我要实现的第一个特征是动词的变形,在方法声明中使用不定式(以-i结尾),并使用jussive(以-u结尾)来调用该方法。

第一个可行的基本实现是这样的:

module Ĝue
  def method_missing(igo, *args, &block)
    case igo
    when /u$/
      celo = igo.to_s.sub(/u$/, 'i').to_s
      send(celo)
    else
      super
    end
  end
end

它有效。现在,下一步是使其更具弹性,因为在模块尝试调用celo时没有保证。也就是说,模块应实现respond_to?方法。因此,问题是,模块如何知道需要模块的上下文是否包括相应的不定式方法?即使使用以下代码测试,即使在模块的开头添加了extend self之后,模块methods.include? :testi内仍然返回false,尽管testu调用可以正常工作: / p>

#!/usr/bin/env ruby

require './teke/ĝue.rb'
include Ĝue
def testi; puts 'testo!' ;end
testu

请注意,测试直接在main范围内运行。我不知道这与使用专用的类范围是否有任何区别,我想不,就我所知,一切都是Ruby中的对象。

1 个答案:

答案 0 :(得分:0)

通过In Ruby, how do I check if method "foo=()" is defined?

找到了可行的解决方案

因此在这种情况下,可以通过以下方式进行检查

eval("defined? #{celo}") == 'method'