📜  红宝石钩子方法

📅  最后修改于: 2022-05-13 01:54:27.741000             🧑  作者: Mango

红宝石钩子方法

Ruby Hook 方法被调用以响应您所做的事情。它们通常用于在运行时扩展方法的工作。这些方法默认没有定义,但是程序员可以根据在任何对象或类或模块上的暗示来定义它们,当某些事件发生时它们会出现。

当调用方法或形成类的子类或合并模块时,这些方法有助于扩展基本原理的行为。 Ruby 语言的元编程能力帮助用户在运行时舒适地编写动态代码。
一旦执行了特定操作,挂钩方法就可以执行特定函数。

有几种 Ruby Hook 方法,但主要有以下几种方法可以发挥重要作用:

  1. 包括
  2. 前置
  3. 扩展
  4. 遗传
  5. 方法缺失

Ruby 中的模块
在了解每种方法之前,需要了解 Ruby 中模块的概念。模块只是一组可以编写一次并在多个地方使用的代码。通常,挂钩方法用于访问它们并对其进行更改。

1. 包括:
此方法用于将方法或属性或模块包含到另一个模块中。该方法使带下划线的模块可用于类的实例。下面的例子解释了 include 方法的用法和工作。

该示例是一个简单的代码,用于在模块在包含它的类中执行时生成注释。

Ruby
# Declaring a module to greet a person
module Greetings
 
  def self.included(person_to_be_greeted)
 
    puts "The #{person_to_be_greeted} is welcomed with an open heart !"
  end
end
 
 
# Class where the module is included
class Person
 
  include Greetings # implementation of the include statement
end


Ruby
# Code as an example for prepend method
module Ruby
 
  def self.prepended(target)# Implementation of prepend method
    puts "#{self} has been prepended to #{target}"
  end
 
  def Type
    "The Type belongs to Ruby"
  end
end
 
class Coding
 
  prepend Ruby # the module Ruby is prepended
end
 
# Method call
puts Coding.new.Type


Ruby
# Code as  an example for extend method
module Ruby
 
  def self.extended(target)
    puts "#{self} was extended by #{target}"
  end
 
  def Type
    "The Type is Ruby"
  end
end
 
class Coding
 
  extend Ruby # Extending the module Ruby
end
 
# Method calling
puts Coding.Type


Ruby
# Making the parent Vehicle class
class Vehicle
 
  def self.inherited(car_type)
    puts "#{car_type} is a kind of Vehicle"
  end
 
end
 
# Target class
class Hyundai < Vehicle #Inhereting the Vehicle class
end


Ruby
# The main class
class Ruby
 
  def method_missing(input, *args) # method_missing function in action
     "#{input} not defined on #{self}"
  end
 
  def Type
    "The Type is Ruby"
  end
end
 
var = Ruby.new
 
# Calling a method that exists
puts var.Type   
 
# Calling a method that does not exist
puts var.Name


输出:

The Person is welcomed with an open heart !

2.前置:
这种方法是 Ruby 2.0 带来的。这与我们上面观察到的略有不同。前置方法提供了另一种在不同位置扩展模块功能的方法。这使用了覆盖的概念。可以使用目标类中定义的方法覆盖模块

Prepended 方法的概念可以通过以下不言自明的示例来理解:

红宝石

# Code as an example for prepend method
module Ruby
 
  def self.prepended(target)# Implementation of prepend method
    puts "#{self} has been prepended to #{target}"
  end
 
  def Type
    "The Type belongs to Ruby"
  end
end
 
class Coding
 
  prepend Ruby # the module Ruby is prepended
end
 
# Method call
puts Coding.new.Type

输出:

Ruby has been prepended to Coding
The Type belongs to Ruby

3. 扩展:
此方法与 include 和 prepend 方法都有点不同。 include 将某个模块中的方法应用于类的实例,而 extend 将这些方法应用于同一个类。

使用extend方法执行上述代码可以如下完成:

红宝石

# Code as  an example for extend method
module Ruby
 
  def self.extended(target)
    puts "#{self} was extended by #{target}"
  end
 
  def Type
    "The Type is Ruby"
  end
end
 
class Coding
 
  extend Ruby # Extending the module Ruby
end
 
# Method calling
puts Coding.Type

输出:

Ruby was extended by Coding
The Type is Ruby

4.继承:
继承作为一个概念是面向对象编程中最重要的概念之一,并且在几乎所有编程语言中都很常见。在 ruby 中,我们处理受现实生活启发的对象,因此,Oops 操作在其中发挥着非常重要的作用。每当实现类的子类时,都会调用继承的方法。它是一种从父类创建子类的方法。

以下示例显示相同:

红宝石

# Making the parent Vehicle class
class Vehicle
 
  def self.inherited(car_type)
    puts "#{car_type} is a kind of Vehicle"
  end
 
end
 
# Target class
class Hyundai < Vehicle #Inhereting the Vehicle class
end

输出:

Hyundai is a kind of Vehicle

5.method_missing:
method_missing 方法是 Ruby 中使用最广泛的方法之一。当一个人试图在一个不存在的对象上调用一个方法时,这就会起作用。

以下示例解释了它的工作原理:

红宝石

# The main class
class Ruby
 
  def method_missing(input, *args) # method_missing function in action
     "#{input} not defined on #{self}"
  end
 
  def Type
    "The Type is Ruby"
  end
end
 
var = Ruby.new
 
# Calling a method that exists
puts var.Type   
 
# Calling a method that does not exist
puts var.Name 

输出:

The Type is Ruby
Name not defined on # (object var)

回调的概念经常与钩子方法混淆。虽然回调是程序代码的元素,如方法、模块等,但钩子只是代码中访问它们的地方。因此,回调的概念不应与 Ruby 中的钩子混淆。

众所周知,Ruby 语言是一门与日常生活中的对象和方法有着非常清晰对应的编程语言,需要一个在同一领域工作的人,对所有必要的 Oops 概念和 Hook 方法有透彻的了解。其中之一。