【问题标题】:In a Ruby module, how do you test if a method exists in the context which use the module?在 Ruby 模块中,如何测试使用该模块的上下文中是否存在方法?
【发布时间】:2018-07-01 15:31:25
【问题描述】:

一些上下文

我正在玩 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 调用完美:

#!/usr/bin/env ruby

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

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

【问题讨论】:

    标签: ruby reflection dsl


    【解决方案1】:

    通过In Ruby, how do I check if method "foo=()" is defined?找到了可行的解决方案

    所以在这种情况下,这可以通过

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

    【讨论】:

    • 实际上还不完全正确。事实上,似乎defined? 将在celoto_s 方法的任何时候返回“方法”。首先我的意思是to_sym,即使这样它也行不通。参数应该是与celo 字符串对应的标识符。
    • 解决了问题
    猜你喜欢
    • 2011-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多