Maison développement back-end Tutoriel Python Ruby元编程基础学习笔记整理

Ruby元编程基础学习笔记整理

Jul 22, 2016 am 08:56 AM
ruby 元编程

笔记一:
代码中包含变量,类和方法,统称为语言构建(language construct)。

# test.rb
class Greeting
 def initialize(text)
  @text = text
 end

 def welcome
  @text
 end
end
my_obj = Greeting.new("hello")
puts my_obj.class
puts my_obj.class.instance_methods(false) #false means not inherited
puts my_obj.instance_variables

result =>
Greeting
welcome
@text

Copier après la connexion

总结:
实例方法继承于类,实例变量存在于对象本身。
类和对象都是ruby中的第一类值。

应用示例:

mongo API for ruby => Mongo::MongoClient

# testmongo.rb
require 'mongo'
require 'pp'

include Mongo

# the members of replcation-set
# test mongodb server version 2.6.0
host = "192.168.11.51"
# The port of members
# If the port is 27017 by default then otherport don't need to assignment
otherport = ""
port = otherport.length != 0 ? otherport : MongoClient::DEFAULT_PORT

opts = {:pool_size => 5, :pool_timeout => 10}
# Create a new connection
client = MongoClient.new(host, port, opts)

# puts client.class
puts client.class.constants
puts client.instance_variables
puts client.class.instance_methods(false)


Copier après la connexion

分别输出

Constant, Instance Attribute, Instance Method
Copier après la connexion

笔记二:动态调用
当你调用一个方法时,实际是给一个对象发送了一条消息。

class MyClass
 def my_method(args)
  args * 10
 end
end
obj = MyClass.new

puts obj.my_method(5)
puts "**"
puts obj.send(:my_method, 6)

Copier après la connexion

结果:

50
**
60
Copier après la connexion

可以使用object#send()取代点标记符来调用MyClass#my_method()方法:

obj.send(:my_method, 6)
Copier après la connexion

send()方法第一个参数是要发送给对象的消息,可以是符号(:symbol)或字符串,其他参数会直接传递给调用的方法。
可以动态的决定调用哪个方法的技术,成为Dynamic Dispatch。

笔记三:符号和字符串的区别
1. 符号不可变,可以修改字符串中的字符。
2. 针对符号的操作更快些。
3. 通常符号用来表示事物的名字。
例如:

puts 1.send(:+, 4) => 5
String#to_sym(),String#intern() => string to symbol
String#to_s(),String#id2name() => symbol to string
"caoqing".to_sym() => :caoqing
:caoqing.to_s() => "caoqing"
Copier après la connexion

动态派发中使用模式派发(pattern dispatch)的方法。

puts obj.class.instance_methods(true).delete_if{ |method_name| method_name !~ /^my/}
result => 
my_method
Copier après la connexion

笔记四:动态定义
使用Module#define_method()方法定义一个方法。

class MyClass
 define_method :my_method do |args|
  args * 3
 end
end
obj = MyClass.new
puts obj.my_method(10)
Copier après la connexion

结果:<font face="Courier New">30</font><br />

单件方法允许给单个对象增加一个方法。singleton methods

# test.rb
str = "My name is caoqing."
def str.title&#63;
 self.upcase == self
end

puts str.title&#63;
puts str.methods.grep(/^title&#63;/)
puts str.singleton_methods

Copier après la connexion

结果:

false
title&#63;
title&#63;
Copier après la connexion

笔记五:
类方法的本质,类是对象,类名是常量。在类上调用方法和对象调用方法一样:

obj.my_method
Cla.class_method
Copier après la connexion

Duck Typing:对象能不能响应方法,可以是普通方法或者单件方法。
类方法的实质就是他们是类的一个单件方法。

def obj.method
 # method body
end
Copier après la connexion

obj可以是对象引用,常量类名或self。

类宏(Class Macro)
Ruby对象没有属性,可以使用拟态方法定义属性。
Module#attr_*()方法中的一员来定义访问器。类宏不是关键字而是方法。

Eigenclass
单件方法按照常规的方法查找在祖先链无法找到保存的地方,obj是对象不能保存,也不能存在于class内,否则所有的实例都可以共享这个方法。
对象拥有一个特有的隐藏类,称为该对象的eigenclass。
进入eigenclass作用域:

class << obj
 code
end
Copier après la connexion

如果想获取eigenclass的引用,则可以在离开该作用域时返回self:

附录:
类变量,实例变量,类方法,实例方法区别
@@ :var类变量
@ :实例变量
self(?clas,::).method :类方法
method :实例方法

# test.rb
class Foo
 @@var = "lion"
 def self.method01
  puts "cat"
  @name = "cat"
  @@var = "cat"
  puts @name
 end

 def self.method02
  puts "tiger"
  @name = "tiger"
  @@var = "tiger"
  puts @name
 end

 def self.method03
  puts "dog"
  @name = "dog"
  @@var = "dog"
  puts @name
 end

 def putsname
  puts @name
  puts @@var
 end
end

obj = Foo.new
# obj.method01   => (NoMethodError)

obj.putsname   => lion

Foo.method01
Foo.method02
Foo.method03
obj.putsname

Copier après la connexion

结果:

lion
cat
cat
tiger
tiger
dog
dog

dog

Copier après la connexion

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Article chaud

R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Meilleurs paramètres graphiques
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Comment réparer l'audio si vous n'entendez personne
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Où trouver la courte de la grue à atomide atomique
1 Il y a quelques semaines By DDD

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Modèle de métaprogrammation en C++ FAQ Questions d'entretien Modèle de métaprogrammation en C++ FAQ Questions d'entretien Aug 22, 2023 pm 03:33 PM

C++ est un langage de programmation largement utilisé dans divers domaines. Sa métaprogrammation de modèles est une technologie de programmation avancée qui permet aux programmeurs de transformer des types et des valeurs au moment de la compilation. La métaprogrammation de modèles est un sujet largement discuté en C++, les questions qui y sont liées sont donc assez courantes dans les entretiens. Voici quelques modèles courants de questions d'entretien de métaprogrammation en C++ qui pourraient vous être posées. Qu’est-ce que la métaprogrammation de modèles ? La métaprogrammation de modèles est une technique permettant de manipuler des types et des valeurs au moment de la compilation. Il utilise des modèles et des métafonctions pour générer en fonction des types et des valeurs

Pourquoi Python, Ruby et d'autres langages ont-ils rendu obsolète l'opérateur d'incrémentation ? Pourquoi Python, Ruby et d'autres langages ont-ils rendu obsolète l'opérateur d'incrémentation ? May 11, 2023 pm 04:37 PM

Beaucoup de gens peuvent remarquer un phénomène, c'est-à-dire que dans certains langages de programmation modernes (bien sûr, sans faire référence aux langages de programmation "récents"), les opérateurs d'incrémentation et de décrémentation ont été annulés. En d'autres termes, il n'existe pas d'expression telle que i++ ou j-- dans ces langages, mais seulement i+=1 ou j-=1. Cette réponse explorera le contexte et les raisons de ce phénomène du point de vue de la philosophie du design. À proprement parler, il peut être biaisé de dire "i++ est en train de disparaître", car il semble que seuls Python, Rust et Swift parmi les langages de programmation traditionnels ne prennent pas en charge les opérateurs d'incrémentation et de décrémentation. Quand je suis entré en contact avec Python pour la première fois, c'était aussi

Analyse approfondie des similitudes et des différences entre Golang et Ruby Analyse approfondie des similitudes et des différences entre Golang et Ruby Jun 01, 2024 pm 08:46 PM

La principale différence entre Go et Ruby est que Go est un langage compilé à typage statique qui prend en charge un parallélisme léger et une gestion efficace de la mémoire, et convient à l'écriture d'applications à haute concurrence ; Ruby est un langage interprété à typage dynamique qui prend en charge le véritable parallélisme mais la gestion de la mémoire. nécessite un contrôle manuel et convient à l’écriture d’applications Web flexibles.

L'application de la réflexion Golang dans la métaprogrammation et la génération de code L'application de la réflexion Golang dans la métaprogrammation et la génération de code May 03, 2024 pm 09:30 PM

La réflexion est très utile en métaprogrammation et en génération de code dans le langage Go : Métaprogrammation : permet au programme de créer de nouveaux types, fonctions et variables au moment de l'exécution, et de modifier les structures de types existantes. Génération de code : des extraits de code peuvent être générés dynamiquement et exécutés au moment de l'exécution, par exemple en générant des fonctions qui implémentent une interface spécifique.

Comment la métaprogrammation C++ joue-t-elle un rôle dans le calcul haute performance ? Comment la métaprogrammation C++ joue-t-elle un rôle dans le calcul haute performance ? Jun 01, 2024 pm 05:31 PM

La métaprogrammation C++ joue un rôle essentiel dans le HPC, grâce à sa capacité à manipuler et générer du code, elle fournit un outil puissant pour optimiser les performances et la maintenabilité du code. Les applications spécifiques incluent : Vectorisation SIMD : création de code personnalisé pour un processeur SIMD spécifique afin de tirer parti des capacités du processeur et d'améliorer les performances. Génération de code : utilisez des modèles pour créer et optimiser dynamiquement du code afin d'améliorer la maintenabilité du code. Introspection : affichez et modifiez la structure du code au moment de l'exécution pour améliorer la capacité de débogage et la flexibilité du code. Programmation de métadonnées : traitez la relation entre les données et les métadonnées pour réaliser une programmation basée sur les données.

Quel est le rôle de la métaprogrammation C++ pour garantir la sécurité et l'exactitude du code ? Quel est le rôle de la métaprogrammation C++ pour garantir la sécurité et l'exactitude du code ? Jun 02, 2024 pm 08:17 PM

La métaprogrammation peut améliorer considérablement la sécurité, l'exactitude et la maintenabilité du code C++. Il est basé sur la capacité d'inspecter les informations de type dans le code pour implémenter des assertions statiques. Générez du code de type sécurisé à l'aide de la métaphysique des modèles. Vérification statique des conditions d'erreur dans la gestion des erreurs.

Comment Ruby utilise-t-il la connexion Mysql2 pour faire fonctionner MySQL ? Comment Ruby utilise-t-il la connexion Mysql2 pour faire fonctionner MySQL ? Apr 17, 2023 pm 10:07 PM

Ruby exploite MySQL en utilisant mysql2 pour se connecter à mysql et faire fonctionner mysql. geminstallmysql2 se connecte à mysql pour établir une connexion : require'mysql2'conn=Mysql2::Client.new({host:'192.168.200.73',username:'root',password:'P@ssword1!'}) La connexion acceptée les options incluent : Mysql2 ::Clie

Exploration des fonctionnalités du langage Golang : génération automatique de code et métaprogrammation Exploration des fonctionnalités du langage Golang : génération automatique de code et métaprogrammation Jul 17, 2023 pm 07:33 PM

Exploration des fonctionnalités du langage Golang : génération automatique de code et métaprogrammation Introduction : Golang, en tant que langage de programmation moderne, présente de nombreux avantages tels que la simplicité, l'efficacité et une forte concurrence. En plus de ces fonctionnalités de base, Golang propose également des fonctionnalités avancées telles que la génération automatique de code et la métaprogrammation. Cet article approfondira les deux fonctionnalités et démontrera leur utilisation avec des exemples de code. 1. Génération automatique de code La génération automatique de code est une technologie qui génère du code spécifique en écrivant du code modèle. Cette technique réduit la duplication

See all articles