我需要返回属于ruby核心的所有类的数组。
http://ruby-doc.org/core-2.2.3/
例如,数组应该是这样的:
[Array, String, Hash etc..]
也可以是字符串,例如:
['Array', 'String', 'Hash']
这应该用于查找ri的文档,但是在调用ri之前 - 它必须仅适用于ruby核心文档,故意不适用于ruby的任何其他部分(vanilla ruby是针对一个项目的目标)这里,唯一可用的常量是用户计算机上的默认ruby安装。
感谢。
答案 0 :(得分:3)
ObjectSpace.each_object(Class). # Get all instances of `Class`
reject {|klass| klass.name.nil? } # Reject singleton classes
# => [ARGF.class, ArgumentError, Array, BasicObject, Bignum, Binding, Class,
# Complex, Complex::compatible, Data, Dir, EOFError, Encoding,
# Encoding::CompatibilityError, Encoding::Converter,
# Encoding::ConverterNotFoundError, Encoding::InvalidByteSequenceError,
# Encoding::UndefinedConversionError, EncodingError, Enumerator,
# Enumerator::Generator, Enumerator::Lazy, Enumerator::Yielder, Errno::E2BIG,
# Errno::EACCES, Errno::EADDRINUSE, Errno::EADDRNOTAVAIL, Errno::EAFNOSUPPORT,
# Errno::EAGAIN, Errno::EALREADY, Errno::EAUTH, Errno::EBADF, Errno::EBADMSG,
# Errno::EBADRPC, Errno::EBUSY, Errno::ECANCELED, Errno::ECHILD,
# Errno::ECONNABORTED, Errno::ECONNREFUSED, Errno::ECONNRESET, Errno::EDEADLK,
# Errno::EDESTADDRREQ, Errno::EDOM, Errno::EDQUOT, Errno::EEXIST,
# Errno::EFAULT, Errno::EFBIG, Errno::EFTYPE, Errno::EHOSTDOWN,
# Errno::EHOSTUNREACH, Errno::EIDRM, Errno::EILSEQ, Errno::EINPROGRESS,
# Errno::EINTR, Errno::EINVAL, Errno::EIO, Errno::EISCONN, Errno::EISDIR,
# Errno::ELOOP, Errno::EMFILE, Errno::EMLINK, Errno::EMSGSIZE,
# Errno::EMULTIHOP, Errno::ENAMETOOLONG, Errno::ENEEDAUTH, Errno::ENETDOWN,
# Errno::ENETRESET, Errno::ENETUNREACH, Errno::ENFILE, Errno::ENOATTR,
# Errno::ENOBUFS, Errno::ENODATA, Errno::ENODEV, Errno::ENOENT,
# Errno::ENOEXEC, Errno::ENOLCK, Errno::ENOLINK, Errno::ENOMEM, Errno::ENOMSG,
# Errno::ENOPROTOOPT, Errno::ENOSPC, Errno::ENOSR, Errno::ENOSTR,
# Errno::ENOSYS, Errno::ENOTBLK, Errno::ENOTCONN, Errno::ENOTDIR,
# Errno::ENOTEMPTY, Errno::ENOTRECOVERABLE, Errno::ENOTSOCK, Errno::ENOTSUP,
# Errno::ENOTTY, Errno::ENXIO, Errno::EOPNOTSUPP, Errno::EOVERFLOW,
# Errno::EOWNERDEAD, Errno::EPERM, Errno::EPFNOSUPPORT, Errno::EPIPE,
# Errno::EPROCLIM, Errno::EPROCUNAVAIL, Errno::EPROGMISMATCH,
# Errno::EPROGUNAVAIL, Errno::EPROTO, Errno::EPROTONOSUPPORT,
# Errno::EPROTOTYPE, Errno::ERANGE, Errno::EREMOTE, Errno::EROFS,
# Errno::ERPCMISMATCH, Errno::ESHUTDOWN, Errno::ESOCKTNOSUPPORT,
# Errno::ESPIPE, Errno::ESRCH, Errno::ESTALE, Errno::ETIME, Errno::ETIMEDOUT,
# Errno::ETOOMANYREFS, Errno::ETXTBSY, Errno::EUSERS, Errno::EXDEV,
# Errno::NOERROR, Exception, FalseClass, Fiber, FiberError, File, File::Stat,
# Fixnum, Float, FloatDomainError, Gem::BasicSpecification,
# Gem::CommandLineError, Gem::ConflictError, Gem::DependencyError,
# Gem::DependencyRemovalException, Gem::DependencyResolutionError,
# Gem::DocumentError, Gem::EndOfYAMLException, Gem::ErrorReason,
# Gem::Exception, Gem::FilePermissionError, Gem::FormatException,
# Gem::GemNotFoundException, Gem::GemNotInHomeException,
# Gem::ImpossibleDependenciesError, Gem::InstallError,
# Gem::InvalidSpecificationException, Gem::List, Gem::LoadError,
# Gem::OperationNotSupportedError, Gem::Platform, Gem::PlatformMismatch,
# Gem::RemoteError, Gem::RemoteInstallationCancelled,
# Gem::RemoteInstallationSkipped, Gem::RemoteSourceException, Gem::Requirement,
# Gem::Requirement::BadRequirementError, Gem::RubyVersionMismatch,
# Gem::SourceFetchProblem, Gem::SpecificGemNotFoundException,
# Gem::Specification, Gem::StubSpecification, Gem::StubSpecification::StubLine,
# Gem::SystemExitException, Gem::UnsatisfiableDependencyError,
# Gem::VerificationError, Gem::Version, Hash, IO, IO::EAGAINWaitReadable,
# IO::EAGAINWaitWritable, IO::EINPROGRESSWaitReadable,
# IO::EINPROGRESSWaitWritable, IOError, IndexError, Integer, Interrupt,
# KeyError, LoadError, LocalJumpError, MatchData, Math::DomainError, Method,
# Module, Monitor, MonitorMixin::ConditionVariable,
# MonitorMixin::ConditionVariable::Timeout, Mutex, NameError,
# NameError::message, NilClass, NoMemoryError, NoMethodError,
# NotImplementedError, Numeric, Object, ObjectSpace::WeakMap, Proc,
# Process::Status, Process::Tms, Process::Waiter, Random, Range, RangeError,
# Rational, Rational::compatible, Regexp, RegexpError, RubyVM, RubyVM::Env,
# RubyVM::InstructionSequence, RuntimeError, ScriptError, SecurityError,
# SignalException, StandardError, StopIteration, String, StringIO, Struct,
# Symbol, SyntaxError, SystemCallError, SystemExit, SystemStackError, Thread,
# Thread::Backtrace, Thread::Backtrace::Location, Thread::ConditionVariable,
# Thread::Queue, Thread::SizedQueue, ThreadError, ThreadGroup, Time,
# TracePoint, TrueClass, TypeError, UnboundMethod, UncaughtThrowError,
# ZeroDivisionError, fatal]
但请注意,通过人为地将自己限制为类,您会错过模块中定义的一些相当重要的方法,例如Kernel#puts
和Kernel#require
。
我从列表中删除了单例类,因为它只会太混乱,但遗憾的是,这意味着您现在缺少,例如using
,这是定义的在通常称为main
的匿名顶级对象的单例类中。
您还错过了不是类或模块的预定义值,例如Float::INFINITY
,true
,false
,nil
等。
另请注意,这将返回所有加载的类,不仅包括来自核心库的类,还包括特定于实现的类。例如,整个RubyVM
命名空间是YARV的私有内部实现细节,在其他Ruby实现中不存在。同样,Fixnum
和Bignum
不能保证存在,Ruby语言规范只保证有一个Integer
类,可能有也可能没有零个或多个特定于实现的子类。 / p>
保证代码在所有Ruby实现上运行的更好方法是限制自己使用Expert MySQL中定义的语言,模块和类。