What's the nature of “property” in a Ruby class?

前端 未结 3 1744
攒了一身酷
攒了一身酷 2021-01-19 02:00

I don\'t understand the keywords like attr_reader or property in the following example:

class Voiture 
  attr_reader :name
  attr_         


        
相关标签:
3条回答
  • 2021-01-19 02:53

    You will want to monkey patch the class Module. That's where methods like attr_reader reside.

    class Module
      def magic(args)
         puts args.inspect
      end
    end
    
    class A
      magic :hello, :hi
    end
    #=> [:hello, :hi]
    

    As The Tin Man mentioned, monkey-patching base-level classes can be dangerous. Consider it like time-traveling into the past and adding something in the past. Just make sure that what you are adding isn't going to overwrite some other event or else you could come back to a Ruby script/timeline that isn't the same one you left.

    0 讨论(0)
  • 2021-01-19 03:05

    Those are class methods, you can add them to a class, or create your own class that has addition methods. In your own class:

    class Voiture
      def self.my_first_class_method(*arguments)
        puts arguments
      end
    end
    

    Or to add to a class:

    Voiture.class_eval do
      define_method :my_second_class_method do |*arguments|
        puts arguments
      end
    end
    

    Once such a class method is defined, you can use it like this:

    class VoitureChild < Voiture
    
        my_first_class_method "print this"
    
        my_second_class_method "print this"
    
    end
    

    There are also ways to do this by adding modules to a class, which is often how rails does such things, such as using a Concern.

    0 讨论(0)
  • 2021-01-19 03:06

    That are just class methods. In this example has_foo adds a foo method to an instance that puts a string:

    module Foo
      def has_foo(value)
        class_eval <<-END_OF_RUBY, __FILE__, __LINE__ + 1
          def foo
            puts "#{value}"
          end
        END_OF_RUBY
      end
    end
    
    class Baz
      extend Foo
      has_foo 'Hello World'
    end
    
    Baz.new.foo   # => Hello World
    
    0 讨论(0)
提交回复
热议问题