【问题标题】:Correct term for an automatically generated method or variable?自动生成的方法或变量的正确术语?
【发布时间】:2014-01-09 23:41:58
【问题描述】:

Rails 大量使用自动生成各种方法和变量。在我自己的私人笔记中,我将它们称为dynamic methods,但是这些东西的正式名称是什么?

这些dynamic methods的一些例子:

创建这样的关系:

class Carriage < ActiveRecord::Base
    # attrs: id, wheels, spare
    has_one :horse
end
class Horse < ActiveRecord::Base
    # attrs: id, carriage_id, name
    belongs_to :carriage
end  

表示您可以这样做:

> Carriage.create(wheels: 2).create_horse(name: "Fledge")

在该示例中,create_horse 将是 dynamic method

另一个例子:

如果我要创建一个模型方法来将轮子添加到Carriage

class Carriage < ActiveRecord::Base
    self.wheels = wheels + 1 if spare == true 
end

我可以访问实例的属性,每个属性都在其自己的 dynamic 变量中:wheelsspareid 也适用于该方法。我称这些为dynamic 变量,但它们的正式名称是什么?

【问题讨论】:

  • 如果有官方名称,我希望在docs 中找到它们,但我没有看到它们在那里调用任何东西,除了方法
  • 就我个人而言,我将它们称为“魔术方法”,因为 Rails 为您创建它们“就像魔术一样”,但那……可能不是标准的,比方说。

标签: ruby-on-rails terminology


【解决方案1】:

正确答案是这些方法是由Ruby metaprogramming在运行时生成的。

the source here

# Defines the (build|create)_association methods for belongs_to or has_one association

def self.define_constructors(mixin, name)
  mixin.class_eval <<-CODE, __FILE__, __LINE__ + 1
    def build_#{name}(*args, &block)
      association(:#{name}).build(*args, &block)
    end

    def create_#{name}(*args, &block)
      association(:#{name}).create(*args, &block)
    end

    def create_#{name}!(*args, &block)
      association(:#{name}).create!(*args, &block)
    end
  CODE
end

基本上,&lt;&lt;-CODE, __FILE__, __LINE__ + 1CODE 之间的巨大模板在运行时被评估以生成以下方法:

  • build_horse
  • create_horse
  • create_horse!

因此,当您调用它们时,它们与您在 Carriage 类中定义的其他方法没有任何不同。

【讨论】:

  • 很有趣,但他们似乎没有名字。 define_constructors 是否意味着他们可能被称为 constructors
  • 根本不,它们被称为构造函数,因为它们构建对象,但这并没有传达元编程结果的含义:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-09-02
  • 2021-11-18
  • 2021-12-25
  • 1970-01-01
  • 2015-06-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多