-2

我正在尝试找到一种获取模块和类名的方法,以便为我提供有关单个常量的更多信息。在我可以枚举常量之类的东西的情况下,我想对它们进行附加并对其进行一些评估。我以前见过类似的东西,但不记得在哪里。Errno 模块只是一个例子。

Errno.constants.sort.each do |name| 
  symbol = "#{Errno}::#{name}::#{Errno}".to_sym
  p eval("#{symbol}")
end

puts Errno::E2BIG::Errno

那行得通,但我更喜欢这个答案。

这更像是我开始玩模块的过程。

puts "Comparable.class = #{Comparable.class}"

# now find out what classes and modules include Comparable.

Object.constants.sort.each do |name|
  test = Object.const_get(name).class
  if test == Class || test == Module 
    if Object.const_get(name).include?(Comparable)
      puts "#{Object.const_get(name)}"
    end
  end
end

但是标准库中还有更多内容,所以我需要它们。这一切只是为了为我的参考库制作我自己的可运行的小代码。

像:

Comparable.public_instance_methods(false).sort.each do |name| 
  puts "Comparable.public_instance_methods = #{name}"
end

这适用于我正在查看的类或模块的每个文件。我使用 hi·er·ar·chy 的目录结构。只有模块和类是分开的。

4

1 回答 1

3

然后走这条路:-

在我的Window-XP机器上:

Errno.constants.sort.each do |name| 
 puts "Errno::#{name}::Errno => #{Errno.const_get(name).const_get(:Errno)}"
end

输出:

Errno::E2BIG::Errno => 7
Errno::EACCES::Errno => 13
Errno::EADDRINUSE::Errno => 10048
Errno::EADDRNOTAVAIL::Errno => 10049
Errno::EADV::Errno => 0
Errno::EAFNOSUPPORT::Errno => 10047
Errno::EAGAIN::Errno => 11
Errno::EALREADY::Errno => 10037
Errno::EAUTH::Errno => 0
Errno::EBADE::Errno => 0
Errno::EBADF::Errno => 9
Errno::EBADFD::Errno => 0
Errno::EBADMSG::Errno => 0
Errno::EBADR::Errno => 0
Errno::EBADRPC::Errno => 0
Errno::EBADRQC::Errno => 0
Errno::EBADSLT::Errno => 0
Errno::EBFONT::Errno => 0
Errno::EBUSY::Errno => 16
Errno::ECANCELED::Errno => 0
Errno::ECHILD::Errno => 10
Errno::ECHRNG::Errno => 0
Errno::ECOMM::Errno => 0
Errno::ECONNABORTED::Errno => 10053
Errno::ECONNREFUSED::Errno => 10061
Errno::ECONNRESET::Errno => 10054
Errno::EDEADLK::Errno => 36
Errno::EDEADLOCK::Errno => 36
Errno::EDESTADDRREQ::Errno => 10039
Errno::EDOM::Errno => 33
Errno::EDOOFUS::Errno => 0
Errno::EDOTDOT::Errno => 0
Errno::EDQUOT::Errno => 10069
Errno::EEXIST::Errno => 17
Errno::EFAULT::Errno => 14
Errno::EFBIG::Errno => 27
Errno::EFTYPE::Errno => 0
Errno::EHOSTDOWN::Errno => 10064
Errno::EHOSTUNREACH::Errno => 10065
Errno::EIDRM::Errno => 0
Errno::EILSEQ::Errno => 42
Errno::EINPROGRESS::Errno => 10036
Errno::EINTR::Errno => 4
Errno::EINVAL::Errno => 22
Errno::EIO::Errno => 5
Errno::EIPSEC::Errno => 0
Errno::EISCONN::Errno => 10056
Errno::EISDIR::Errno => 21
Errno::EISNAM::Errno => 0
Errno::EKEYEXPIRED::Errno => 0
Errno::EKEYREJECTED::Errno => 0
Errno::EKEYREVOKED::Errno => 0
Errno::EL2HLT::Errno => 0
Errno::EL2NSYNC::Errno => 0
Errno::EL3HLT::Errno => 0
Errno::EL3RST::Errno => 0
Errno::ELIBACC::Errno => 0
Errno::ELIBBAD::Errno => 0
Errno::ELIBEXEC::Errno => 0
Errno::ELIBMAX::Errno => 0
Errno::ELIBSCN::Errno => 0
Errno::ELNRNG::Errno => 0
Errno::ELOOP::Errno => 10062
Errno::EMEDIUMTYPE::Errno => 0
Errno::EMFILE::Errno => 24
Errno::EMLINK::Errno => 31
Errno::EMSGSIZE::Errno => 10040
Errno::EMULTIHOP::Errno => 0
Errno::ENAMETOOLONG::Errno => 38
Errno::ENAVAIL::Errno => 0
Errno::ENEEDAUTH::Errno => 0
Errno::ENETDOWN::Errno => 10050
Errno::ENETRESET::Errno => 10052
Errno::ENETUNREACH::Errno => 10051
Errno::ENFILE::Errno => 23
Errno::ENOANO::Errno => 0
Errno::ENOATTR::Errno => 0
Errno::ENOBUFS::Errno => 10055
Errno::ENOCSI::Errno => 0
Errno::ENODATA::Errno => 0
Errno::ENODEV::Errno => 19
Errno::ENOENT::Errno => 2
Errno::ENOEXEC::Errno => 8
Errno::ENOKEY::Errno => 0
Errno::ENOLCK::Errno => 39
Errno::ENOLINK::Errno => 0
Errno::ENOMEDIUM::Errno => 0
Errno::ENOMEM::Errno => 12
Errno::ENOMSG::Errno => 0
Errno::ENONET::Errno => 0
Errno::ENOPKG::Errno => 0
Errno::ENOPROTOOPT::Errno => 10042
Errno::ENOSPC::Errno => 28
Errno::ENOSR::Errno => 0
Errno::ENOSTR::Errno => 0
Errno::ENOSYS::Errno => 40
Errno::ENOTBLK::Errno => 0
Errno::ENOTCONN::Errno => 10057
Errno::ENOTDIR::Errno => 20
Errno::ENOTEMPTY::Errno => 41
Errno::ENOTNAM::Errno => 0
Errno::ENOTRECOVERABLE::Errno => 0
Errno::ENOTSOCK::Errno => 10038
Errno::ENOTSUP::Errno => 0
Errno::ENOTTY::Errno => 25
Errno::ENOTUNIQ::Errno => 0
Errno::ENXIO::Errno => 6
Errno::EOPNOTSUPP::Errno => 10045
Errno::EOVERFLOW::Errno => 0
Errno::EOWNERDEAD::Errno => 0
Errno::EPERM::Errno => 1
Errno::EPFNOSUPPORT::Errno => 10046
Errno::EPIPE::Errno => 32
Errno::EPROCLIM::Errno => 10067
Errno::EPROCUNAVAIL::Errno => 0
Errno::EPROGMISMATCH::Errno => 0
Errno::EPROGUNAVAIL::Errno => 0
Errno::EPROTO::Errno => 0
Errno::EPROTONOSUPPORT::Errno => 10043
Errno::EPROTOTYPE::Errno => 10041
Errno::ERANGE::Errno => 34
Errno::EREMCHG::Errno => 0
Errno::EREMOTE::Errno => 10071
Errno::EREMOTEIO::Errno => 0
Errno::ERESTART::Errno => 0
Errno::ERFKILL::Errno => 0
Errno::EROFS::Errno => 30
Errno::ERPCMISMATCH::Errno => 0
Errno::ESHUTDOWN::Errno => 10058
Errno::ESOCKTNOSUPPORT::Errno => 10044
Errno::ESPIPE::Errno => 29
Errno::ESRCH::Errno => 3
Errno::ESRMNT::Errno => 0
Errno::ESTALE::Errno => 10070
Errno::ESTRPIPE::Errno => 0
Errno::ETIME::Errno => 0
Errno::ETIMEDOUT::Errno => 10060
Errno::ETOOMANYREFS::Errno => 10059
Errno::ETXTBSY::Errno => 0
Errno::EUCLEAN::Errno => 0
Errno::EUNATCH::Errno => 0
Errno::EUSERS::Errno => 10068
Errno::EWOULDBLOCK::Errno => 10035
Errno::EXDEV::Errno => 18
Errno::EXFULL::Errno => 0
Errno::NOERROR::Errno => 0

在我的Ubuntu 13.04中,输出如下所示:

require 'awesome_print'

h = Errno.constants.sort.each_with_object({}) do |name,h| 
 h["Errno::#{name}::Errno"] = Errno.const_get(name).const_get(:Errno)
end

ap h

输出:

{
              "Errno::E2BIG::Errno" => 7,
             "Errno::EACCES::Errno" => 13,
         "Errno::EADDRINUSE::Errno" => 98,
      "Errno::EADDRNOTAVAIL::Errno" => 99,
               "Errno::EADV::Errno" => 68,
       "Errno::EAFNOSUPPORT::Errno" => 97,
             "Errno::EAGAIN::Errno" => 11,
           "Errno::EALREADY::Errno" => 114,
              "Errno::EAUTH::Errno" => 0,
              "Errno::EBADE::Errno" => 52,
              "Errno::EBADF::Errno" => 9,
             "Errno::EBADFD::Errno" => 77,
            "Errno::EBADMSG::Errno" => 74,
              "Errno::EBADR::Errno" => 53,
            "Errno::EBADRPC::Errno" => 0,
            "Errno::EBADRQC::Errno" => 56,
            "Errno::EBADSLT::Errno" => 57,
             "Errno::EBFONT::Errno" => 59,
              "Errno::EBUSY::Errno" => 16,
          "Errno::ECANCELED::Errno" => 125,
             "Errno::ECHILD::Errno" => 10,
             "Errno::ECHRNG::Errno" => 44,
              "Errno::ECOMM::Errno" => 70,
       "Errno::ECONNABORTED::Errno" => 103,
       "Errno::ECONNREFUSED::Errno" => 111,
         "Errno::ECONNRESET::Errno" => 104,
            "Errno::EDEADLK::Errno" => 35,
          "Errno::EDEADLOCK::Errno" => 35,
       "Errno::EDESTADDRREQ::Errno" => 89,
               "Errno::EDOM::Errno" => 33,
            "Errno::EDOOFUS::Errno" => 0,
            "Errno::EDOTDOT::Errno" => 73,
             "Errno::EDQUOT::Errno" => 122,
             "Errno::EEXIST::Errno" => 17,
             "Errno::EFAULT::Errno" => 14,
              "Errno::EFBIG::Errno" => 27,
             "Errno::EFTYPE::Errno" => 0,
          "Errno::EHOSTDOWN::Errno" => 112,
       "Errno::EHOSTUNREACH::Errno" => 113,
              "Errno::EIDRM::Errno" => 43,
             "Errno::EILSEQ::Errno" => 84,
        "Errno::EINPROGRESS::Errno" => 115,
              "Errno::EINTR::Errno" => 4,
             "Errno::EINVAL::Errno" => 22,
                "Errno::EIO::Errno" => 5,
             "Errno::EIPSEC::Errno" => 0,
            "Errno::EISCONN::Errno" => 106,
             "Errno::EISDIR::Errno" => 21,
             "Errno::EISNAM::Errno" => 120,
        "Errno::EKEYEXPIRED::Errno" => 127,
       "Errno::EKEYREJECTED::Errno" => 129,
        "Errno::EKEYREVOKED::Errno" => 128,
             "Errno::EL2HLT::Errno" => 51,
           "Errno::EL2NSYNC::Errno" => 45,
             "Errno::EL3HLT::Errno" => 46,
             "Errno::EL3RST::Errno" => 47,
            "Errno::ELIBACC::Errno" => 79,
            "Errno::ELIBBAD::Errno" => 80,
           "Errno::ELIBEXEC::Errno" => 83,
            "Errno::ELIBMAX::Errno" => 82,
            "Errno::ELIBSCN::Errno" => 81,
             "Errno::ELNRNG::Errno" => 48,
              "Errno::ELOOP::Errno" => 40,
        "Errno::EMEDIUMTYPE::Errno" => 124,
             "Errno::EMFILE::Errno" => 24,
             "Errno::EMLINK::Errno" => 31,
           "Errno::EMSGSIZE::Errno" => 90,
          "Errno::EMULTIHOP::Errno" => 72,
       "Errno::ENAMETOOLONG::Errno" => 36,
            "Errno::ENAVAIL::Errno" => 119,
          "Errno::ENEEDAUTH::Errno" => 0,
           "Errno::ENETDOWN::Errno" => 100,
          "Errno::ENETRESET::Errno" => 102,
        "Errno::ENETUNREACH::Errno" => 101,
             "Errno::ENFILE::Errno" => 23,
             "Errno::ENOANO::Errno" => 55,
            "Errno::ENOATTR::Errno" => 0,
            "Errno::ENOBUFS::Errno" => 105,
             "Errno::ENOCSI::Errno" => 50,
            "Errno::ENODATA::Errno" => 61,
             "Errno::ENODEV::Errno" => 19,
             "Errno::ENOENT::Errno" => 2,
            "Errno::ENOEXEC::Errno" => 8,
             "Errno::ENOKEY::Errno" => 126,
             "Errno::ENOLCK::Errno" => 37,
            "Errno::ENOLINK::Errno" => 67,
          "Errno::ENOMEDIUM::Errno" => 123,
             "Errno::ENOMEM::Errno" => 12,
             "Errno::ENOMSG::Errno" => 42,
             "Errno::ENONET::Errno" => 64,
             "Errno::ENOPKG::Errno" => 65,
        "Errno::ENOPROTOOPT::Errno" => 92,
             "Errno::ENOSPC::Errno" => 28,
              "Errno::ENOSR::Errno" => 63,
             "Errno::ENOSTR::Errno" => 60,
             "Errno::ENOSYS::Errno" => 38,
            "Errno::ENOTBLK::Errno" => 15,
           "Errno::ENOTCONN::Errno" => 107,
            "Errno::ENOTDIR::Errno" => 20,
          "Errno::ENOTEMPTY::Errno" => 39,
            "Errno::ENOTNAM::Errno" => 118,
    "Errno::ENOTRECOVERABLE::Errno" => 131,
           "Errno::ENOTSOCK::Errno" => 88,
            "Errno::ENOTSUP::Errno" => 95,
             "Errno::ENOTTY::Errno" => 25,
           "Errno::ENOTUNIQ::Errno" => 76,
              "Errno::ENXIO::Errno" => 6,
         "Errno::EOPNOTSUPP::Errno" => 95,
          "Errno::EOVERFLOW::Errno" => 75,
         "Errno::EOWNERDEAD::Errno" => 130,
              "Errno::EPERM::Errno" => 1,
       "Errno::EPFNOSUPPORT::Errno" => 96,
              "Errno::EPIPE::Errno" => 32,
           "Errno::EPROCLIM::Errno" => 0,
       "Errno::EPROCUNAVAIL::Errno" => 0,
      "Errno::EPROGMISMATCH::Errno" => 0,
       "Errno::EPROGUNAVAIL::Errno" => 0,
             "Errno::EPROTO::Errno" => 71,
    "Errno::EPROTONOSUPPORT::Errno" => 93,
         "Errno::EPROTOTYPE::Errno" => 91,
             "Errno::ERANGE::Errno" => 34,
            "Errno::EREMCHG::Errno" => 78,
            "Errno::EREMOTE::Errno" => 66,
          "Errno::EREMOTEIO::Errno" => 121,
           "Errno::ERESTART::Errno" => 85,
            "Errno::ERFKILL::Errno" => 132,
              "Errno::EROFS::Errno" => 30,
       "Errno::ERPCMISMATCH::Errno" => 0,
          "Errno::ESHUTDOWN::Errno" => 108,
    "Errno::ESOCKTNOSUPPORT::Errno" => 94,
             "Errno::ESPIPE::Errno" => 29,
              "Errno::ESRCH::Errno" => 3,
             "Errno::ESRMNT::Errno" => 69,
             "Errno::ESTALE::Errno" => 116,
           "Errno::ESTRPIPE::Errno" => 86,
              "Errno::ETIME::Errno" => 62,
          "Errno::ETIMEDOUT::Errno" => 110,
       "Errno::ETOOMANYREFS::Errno" => 109,
            "Errno::ETXTBSY::Errno" => 26,
            "Errno::EUCLEAN::Errno" => 117,
            "Errno::EUNATCH::Errno" => 49,
             "Errno::EUSERS::Errno" => 87,
        "Errno::EWOULDBLOCK::Errno" => 11,
              "Errno::EXDEV::Errno" => 18,
             "Errno::EXFULL::Errno" => 54,
            "Errno::NOERROR::Errno" => 0
}
于 2013-09-10T15:09:56.287 回答