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
总结:
实例方法继承于类,实例变量存在于对象本身。
类和对象都是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)
分别输出
Constant, Instance Attribute, Instance Method
笔记二:动态调用
当你调用一个方法时,实际是给一个对象发送了一条消息。
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)
结果:
50 ** 60
可以使用object#send()取代点标记符来调用MyClass#my_method()方法:
obj.send(:my_method, 6)
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"
动态派发中使用模式派发(pattern dispatch)的方法。
puts obj.class.instance_methods(true).delete_if{ |method_name| method_name !~ /^my/} result => my_method
笔记四:动态定义
使用Module#define_method()方法定义一个方法。
class MyClass define_method :my_method do |args| args * 3 end end obj = MyClass.new puts obj.my_method(10)
结果:<font face="Courier New">30</font><br />
单件方法允许给单个对象增加一个方法。singleton methods
# test.rb str = "My name is caoqing." def str.title? self.upcase == self end puts str.title? puts str.methods.grep(/^title?/) puts str.singleton_methods
结果:
false title? title?
笔记五:
类方法的本质,类是对象,类名是常量。在类上调用方法和对象调用方法一样:
obj.my_method Cla.class_method
Duck Typing:对象能不能响应方法,可以是普通方法或者单件方法。
类方法的实质就是他们是类的一个单件方法。
def obj.method # method body end
obj可以是对象引用,常量类名或self。
类宏(Class Macro)
Ruby对象没有属性,可以使用拟态方法定义属性。
Module#attr_*()方法中的一员来定义访问器。类宏不是关键字而是方法。
Eigenclass
单件方法按照常规的方法查找在祖先链无法找到保存的地方,obj是对象不能保存,也不能存在于class内,否则所有的实例都可以共享这个方法。
对象拥有一个特有的隐藏类,称为该对象的eigenclass。
进入eigenclass作用域:
class << obj code end
如果想获取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
结果:
lion cat cat tiger tiger dog dog dog

Outils d'IA chauds

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

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

Undress AI Tool
Images de déshabillage gratuites

Clothoff.io
Dissolvant de vêtements AI

AI Hentai Generator
Générez AI Hentai gratuitement.

Article chaud

Outils chauds

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

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

Sujets chauds



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

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

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.

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.

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.

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.

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 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
