【问题标题】:What is the <= operator on Ruby Classes?Ruby 类中的 <= 运算符是什么?
【发布时间】:2011-03-20 06:39:25
【问题描述】:

以下 sn-p 来自 rails 代码

  def rescue_from(*klasses, &block)
    options = klasses.extract_options!

    unless options.has_key?(:with)
      if block_given?
        options[:with] = block
      else
        raise ArgumentError, "Need a handler. Supply an options hash that has a :with key as the last argument."
      end
    end

    klasses.each do |klass|
      key = if klass.is_a?(Class) && klass <= Exception
        klass.name
      elsif klass.is_a?(String)
        klass
      else
        raise ArgumentError, "#{klass} is neither an Exception nor a String"
      end

      # put the new handler at the end because the list is read in reverse
      self.rescue_handlers += [[key, options[:with]]]
    end
  end
end

注意操作符

那是什么?

【问题讨论】:

    标签: ruby operators


    【解决方案1】:

    请参阅http://ruby-doc.org/core/classes/Module.html#M001669 以获取有关模块(以及类)公开的所有比较运算符的文档。

    在这种特定情况下: “如果 mod 是 other 的子类或与 other 相同,则返回 true。如果两者之间没有关系,则返回 nil。(根据类定义考虑关系:“class A

    【讨论】:

      【解决方案2】:

      它类似于is_a? 方法,如果接收者类是参数的子类,则返回true;考虑:

      Fixnum.superclass # => Integer
      Fixnum <= Integer # => true
      

      【讨论】:

        【解决方案3】:

        它是“LHS 与 RHS 是同一类或子类”的运算符。

        这是一种古怪的运算符重载,但请注意,Ruby 中的子类声明也使用

         class SomeClass < ActiveRecord::Base
        

        所以至少在这个意义上是一致的。

        (LHS:左侧,RHS:右侧)

        【讨论】:

        • 为什么你认为这是“古怪的操作符重载”?继承关系对类强加部分排序,一般来说,用于表示强加部分排序的关系的符号是&lt;=(或者更确切地说是,但虽然这是 Ruby 中的有效方法名称,但它不是有效的运算符姓名)。你是正确的,因为用于表示子类型关系的常用运算符是 &lt;:,但这在 Ruby 中既不是有效的方法也不是运算符名称,所以我个人觉得 &lt;= 已经足够好了。它肯定优于使用+ 设置联合(应该是)的常见滥用。
        【解决方案4】:

        很确定这意味着 klass 是一种异常。

        虽然这通常意味着“小于或等于”。所以该代码可能会说它是否至少是一个类但不是一个异常......做点什么。但是“小于”的架构就不合适了。

        来自代码文档

        # 处理程序是继承的。它们是从右到左搜索的,从
        # 自下而上,向上层级。
        第一类的处理程序 # 哪个 exception.is_a?(klass) 成立是被调用的,如果有的话。

        【讨论】:

          猜你喜欢
          • 2021-12-04
          • 2011-03-02
          • 1970-01-01
          • 2011-12-03
          • 2011-09-14
          • 1970-01-01
          • 2013-12-02
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多