在 Ruby 中寻找特定概念的名称

looking for the name of a particular concept in Ruby

在ruby中,当你实例化一个class时,你经常会执行像has_manyvalidates这样的方法。是否有名称来指定这种专门创建的方法,以便在 class 实例化时调用?

建立在...

他们 inherited class methods forming a domain specific language used to make declarations 关于 class。


都是class methods,因为你直接在class上调用then,所以这么叫。 self 将是 class。与在 class 的实例上调用的实例方法相反,对象。

它们也是ActiveRecord继承的方法,它们是 未在您的 class 中定义,而是在祖先 class 或模块中定义。


更具体地说,它们形成了一种领域特定语言;一个数字用户线。这些是以特定方式编写的方法调用,看起来像是一种新语言。例如,

class Player < ApplicationRecord
  validates :terms_of_service, presence: true, acceptance: { message: 'must be abided' }
end

真的是...

Player.validates(
  :terms_of_service,
  presence: true,
  acceptance: { message: 'must be abided' }
)

这是一个包装...

Player.validates_presence_of(:terms_of_service)
Player.validates_acceptance_of(:terms_of_service, message: 'must be abided')

这是一个包装...

Player.validates_with(PresenceValidator, :terms_of_service)
Player.validates_with(AcceptanceValidator, :terms_of_service, message: 'must be abided')

这是一个将验证对象推送到此 class 验证散列的包装器。

# Roughly...
Player._validators[:terms_of_service] << 
  PresenceValidator.new(
    attributes: [:terms_of_service]
  )
Player._validators[:terms_of_service] << 
  AcceptanceValidator.new(
    attributes: [:terms_of_service],
    message: 'must be abided'
  )

最后,领域特定语言是 declarative programming.

的形式

在其他类型的编程中,您告诉程序如何做。例如,假设您想确保属性是大于零的正整数。您可以按程序进行...

object.number.match?(/^\d+$/) && object.number > 0

或者你问一个具体的方法来做...

NumericalityValidator.new(
  attribute: [:number],
  only_integer: true, greater_than: 0
).validate(object)

但在声明式编程中,您声明它将如何实现,而语言会弄清楚如何实现它。

class Player < ApplicationRecord
  validates :number, numericality: { only_integer: true, greater_than: 0 }
end

您可能已经知道两种声明性语言:SQL 和正则表达式。