【问题标题】:access an instance method of a class from another module's instance method从另一个模块的实例方法访问一个类的实例方法
【发布时间】:2014-10-18 12:32:06
【问题描述】:

我有一个声明了许多实例方法的类

class User < Group
  def get_name

  end

  def show_profile

  end

  def get_task(task_id)
    #some logic
  end

end

我想从一个模块中调用其中一些方法。我可以用 Include 语句来做到这一点。

include Users 引入了 User 类的所有方法。在这种情况下,我只想要 get_task 并且明确不想要 get_name、show_profile 等。

我有一个 Tasks 模块,它也有一组方法,其中一个方法调用 User 类的 get_task 方法。

    module Tasks
      class Project
        def design
          tid = 12
          design_task = get_task(tid)
        end
      end
   end

如何在不包括该类的其他不必要方法的情况下实现这一点。请帮忙。

【问题讨论】:

  • 你不包括一个类,你包括一个模块。你到底想做什么?
  • 是的.. 你是对的。对不起..我想要实现的是从模块 Tasks::Project#design 方法调用 get_task 方法..对不起。刚开始学习 ruby​​ 元编程。所以想出了这种场景。
  • 我想你误解了我,你的代码对于模块任务是正确的,现在不是。我的评论是关于您的这些行: include Users 引入了 User 类中的所有方法。在这种情况下,我只想要 get_task 并且明确不想要 get_name、show_profile 等。
  • 我正在尝试理解其中一个应用程序的代码。它的代码如上。模块任务;结束然后声明类。到目前为止,我只看到了像我用来编码模块任务类项目结束的那个。我不确定它与前一个有什么不同。
  • module Tasks;end 表示您在创建模块任务后立即结束了它的范围。因此,类 Project 无法访问为:Task::Project,就像您在之前的评论中发布的那样。这就是它在首次更改和新更改之间的区别。

标签: ruby metaprogramming


【解决方案1】:

如果 get_task 方法不依赖于用户,您可以使用如下所示的类方法。如果取决于用户,则必须先获取服务器,然后才能运行该方法。

class User < Group
    def get_name

    end

    def show_profile

    end

    def self.get_task(task_id)
    #some logic
    end

end

class Project
    def design
        tid = 12
        design_task = User.get_task(tid)
    end
end

【讨论】:

  • 对不起。我没有得到“如果取决于用户,则必须先获取服务器才能运行该方法”的声明
  • 如果你想让“get_task”方法对用户实例做一些事情,你需要先获取用户,然后调用user_variable.get_task(tid)。如果该方法没有对用户的特定实例做任何事情,您可以使用类变量。
猜你喜欢
  • 1970-01-01
  • 2020-07-16
  • 2020-03-19
  • 2012-12-18
  • 2016-01-15
  • 2014-11-05
  • 1970-01-01
  • 1970-01-01
  • 2020-10-15
相关资源
最近更新 更多