首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >“包含”--模块,但仍然不能调用该方法

“包含”--模块,但仍然不能调用该方法
EN

Stack Overflow用户
提问于 2017-04-21 09:07:28
回答 1查看 38关注 0票数 1

为什么下面的代码会出现错误?

代码语言:javascript
复制
require 'open3'

module Hosts
  def read
    include Open3
    popen3("cat /etc/hosts") do |i,o,e,w|
      puts o.read
    end
  end
end

Hosts.read
#=> undefined method `popen3' for Hosts:Class (NoMethodError)

如果我使用完全路径(即popen3 )调用Open3::popen3,它就能工作。但是我已经有了include,-ed,所以我觉得我不需要Open3::了?

谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-04-21 09:10:51

您已经定义了一个实例方法,但正在尝试将其作为单例方法使用。为了使您想要的成为可能,您还必须使用extend Open3,而不是include

代码语言:javascript
复制
module Hosts
  extend Open3

  def read
    popen3("cat /etc/hosts") do |i,o,e,w|
      puts o.read
    end
  end
  module_function :read # makes it available for Hosts
end

现在:

代码语言:javascript
复制
Hosts.read
##
# Host Database
#
# localhost is used to configure the loopback interface
# when the system is booting.  Do not change this entry.
##
127.0.0.1 localhost
255.255.255.255 broadcasthost
::1             localhost
=> nil

阅读Ruby中的以下概念将使事情更加清晰:

  • 上下文
  • self
  • includeextend

module_fuction不同,您还可以通过以下任何一种方法获得相同的结果:

代码语言:javascript
复制
module Hosts
  extend Open3
  extend self

  def read
    popen3("cat /etc/hosts") do |i,o,e,w|
      puts o.read
    end
  end
end

代码语言:javascript
复制
module Hosts
  extend Open3

  def self.read
    popen3("cat /etc/hosts") do |i,o,e,w|
      puts o.read
    end
  end
end
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43538458

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档