0

我对Poignant Guide中的以下代码感到困惑:

# The guts of life force within Dwemthy's Array
class Creature

  # Get a metaclass for this class
  def self.metaclass; class << self; self; end; end

  # Advanced metaprogramming code for nice, clean traits
  def self.traits( *arr )
    return @traits if arr.empty?

    # 1. Set up accessors for each variable
    attr_accessor( *arr )

    # 2. Add a new class method to for each trait.
    arr.each do |a|
      metaclass.instance_eval do
        define_method( a ) do |val|
          @traits ||= {}
          @traits[a] = val
        end
      end
    end

    # 3. For each monster, the `initialize' method
    #    should use the default number for each trait.
    class_eval do
      define_method( :initialize ) do
        self.class.traits.each do |k,v|
          instance_variable_set("@#{k}", v)
        end
      end
    end

  end

  # Creature attributes are read-only
  traits :life, :strength, :charisma, :weapon
end

上面的代码用于创建一个新类,如下所示:

class Dragon < Creature
  life( 1340 )     # tough scales
  strength( 451 )  # bristling veins
  charisma( 1020 ) # toothy smile
  weapon( 939 )    # fire breath
end

我需要自己学习更多元编程的基础知识,但现在我只想知道,val块参数来自define_method( a ) do |val|哪里?它表示分配给每个特征的点值,但我不明白这些数字中的每一个如何成为块参数。

另外,为什么a在括号中传递给define_method,而val作为块参数传递?

我已经阅读了关于 define_method 参数主题的这个问题,但它没有解决将参数传递给define_method而不是传递给块的原因。

4

1 回答 1

1

在表格中

define_method(:foo){|x| ...}

:foo是方法名称并且x是参数。他们有不同的角色。它与以下内容相同:

def foo(x)
  ...
end
于 2013-08-10T18:25:21.617 回答