代码之家  ›  专栏  ›  技术社区  ›  Cary Swoveland

关键字“singleton_class”的引入会破坏Ruby代码还是导致其他困难?

  •  2
  • Cary Swoveland  · 技术社区  · 5 年前

    class C
      @v = 1
    
      def hi
        'hi'
      end
    
      class << self
        attr_reader :v
    
        def ho
          'ho'
        end
      end
    end
    
    C.methods(false)
      #=> [:v, :ho]
    C.ho
      #=> "ho" 
    C.v
      #=> 1
    

    class C
      @v = 1
    
      def hi
        'hi'
      end
    
      def self.ho
        'ho'
      end
    
      singleton_class.class_eval do
        attr_reader :v
      end
    end
    
    C.methods(false)
      #=> [:v, :ho]
    C.ho
      #=> "ho" 
    C.v
      #=> 1
    

    class << self singleton_class.class_eval 原因 self 改变 C C.singleton_class . 假设有一个关键字 singleton_class 这也做了同样的事情,让我们可以写下面的内容。

    class C
      @v = 1
    
      def hi
        'hi'
      end
    
      singleton_class 
    
      attr_reader :v
    
      def ho
        'ho'
      end
    end
    
    C.methods(false)
      #=> [:v, :ho]
    C.ho
      #=> "ho" 
    C.v
      #=> 1
    

    一个可以有另一个关键字,将允许 翻来覆去 和它的singleton类,但它可能是最简单的,需要在 独生子女班 与singleton类相关。

    独生子女班 和同名的局部变量或方法。例如,考虑关键字的使用 private 是一个关键词不正确;这就是方法 Module#private

    class C
      def m
        private = 'hi'
        private
      end
      private :m
    
      private
      def private
        'ho'
      end
    end
    c = C.new
    c.m
      #=> NoMethodError (private method `m' called...
    c.send :m
      #=> "hi"
    c.private
      #=> NoMethodError (private method `private' called...
    c.send :private
      #=> "ho"
    

    我的问题在标题中给出了。您还可以自由地就Ruby是否会从引入以这种方式使用的关键字中获益发表意见。

    1 回复  |  直到 5 年前
        1
  •  1
  •   Jörg W Mittag    5 年前

    总是 破坏现有代码。

    以前,无论您介绍什么,它都是有效的标识符,而现在不是。

    这就是为什么关键字非常“昂贵”,应该非常少地使用。(Ruby已经有太多了,IMO)。