【问题标题】:Are there class-independent methods in Ruby?Ruby 中有与类无关的方法吗?
【发布时间】:2015-01-01 01:22:32
【问题描述】:

Eloquent Ruby 的第一章中,Russ Olsen 写道:

Float 方法将其参数(通常是字符串)转换为浮点数。

Ruby 新手 我一直认为 Ruby 方法在定义上属于类,因此例如 FixnumArray 每个都有自己独立的 :is_a?(大概包括或多或少的共享代码),但“通常是一个字符串”意味着Float 是可以在不同类的对象上调用的单个方法。有人可以澄清一下情况吗?

【问题讨论】:

    标签: ruby class methods


    【解决方案1】:

    Float 既是一个类又是一个method in KernelKernel 模块默认包含在所有 Ruby 对象中,这意味着您可以从任何地方调用Float 方法。

    Float 方法将使用 FloatFixnumString 或具有 to_f 方法的任何其他对象的参数(此方法必须返回 Float) :

    class Foo
       def to_f
         42.0
       end
    end
    Float Foo.new # => 42.0
    

    【讨论】:

    • 感谢您的回答! “或任何其他具有 to_f 方法的对象”——因为Float 是依赖于to_f 的不同方法,或者因为它是to_f 的别名?
    • @hjkml Float 方法按以下顺序检查参数的类型:Fixnum -> Float -> Bignum -> Nil(错误)-> 尝试调用 to_f
    • 谢谢。那么回到我最初问题的核心,每个 Ruby 类都有自己的 to_f 方法吗?不同类的方法版本之间的代码共享程度如何?
    • @hjkml 不,每个 Ruby 类都没有 to_f 方法。只有ObjectBasicObjectKernel 中的方法出现在所有类中。 to_f 方法在 FixnumString 中的实现方式非常不同,例如,由于生成 Float 所需的转换性质。
    • 抱歉,是的,我的意思是“可以调用.to_f 的每个班级”。最后一个问题,再次非常感谢您的帮助和耐心:to_fFixnumString 的实现是否共享任何代码?
    猜你喜欢
    • 2011-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-23
    • 1970-01-01
    • 1970-01-01
    • 2011-11-28
    • 1970-01-01
    相关资源
    最近更新 更多