6

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

class Voiture 
  attr_reader :name
  attr_writer :name
  property :id, Serial
  property :name, String
  property :completed_at, DateTime
end

How do they work? How can I create my own? Are they functions, methods?

class MyClass 
    mymagickstuff :hello
end
4

3 回答 3

1

那只是类方法。在此示例中,has_foofoo方法添加到放置字符串的实例中:

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
于 2013-09-27T16:42:27.197 回答
0

你会想给班级打补丁Module。这就是诸如此类的方法attr_reader所在的位置。

class Module
  def magic(args)
     puts args.inspect
  end
end

class A
  magic :hello, :hi
end
#=> [:hello, :hi]

正如 The Tin Man 所提到的,猴子修补基级课程可能很危险。把它想象成穿越到过去并在过去添加一些东西。只需确保您添加的内容不会覆盖其他事件,否则您可能会回到与您离开时不同的 Ruby 脚本/时间线。

于 2013-09-27T16:41:55.580 回答
0

这些是类方法,您可以将它们添加到类中,或者创建自己的具有添加方法的类。在您自己的班级中:

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

或者添加到一个类:

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

一旦定义了这样的类方法,您就可以像这样使用它:

class VoitureChild < Voiture

    my_first_class_method "print this"

    my_second_class_method "print this"

end

还有一些方法可以通过向类添加模块来做到这一点,这通常是 rails 做这些事情的方式,例如使用Concern.

于 2013-09-27T16:42:12.657 回答