Rumah pembangunan bahagian belakang Tutorial Python Ruby元编程基础学习笔记整理

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

Jul 22, 2016 am 08:56 AM
ruby pengaturcaraan meta

笔记一:
代码中包含变量,类和方法,统称为语言构建(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

Salin selepas log masuk

总结:
实例方法继承于类,实例变量存在于对象本身。
类和对象都是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)


Salin selepas log masuk

分别输出

Constant, Instance Attribute, Instance Method
Salin selepas log masuk

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

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)

Salin selepas log masuk

结果:

50
**
60
Salin selepas log masuk

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

obj.send(:my_method, 6)
Salin selepas log masuk

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"
Salin selepas log masuk

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

puts obj.class.instance_methods(true).delete_if{ |method_name| method_name !~ /^my/}
result => 
my_method
Salin selepas log masuk

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

class MyClass
 define_method :my_method do |args|
  args * 3
 end
end
obj = MyClass.new
puts obj.my_method(10)
Salin selepas log masuk

结果:<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

Salin selepas log masuk

结果:

false
title&#63;
title&#63;
Salin selepas log masuk

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

obj.my_method
Cla.class_method
Salin selepas log masuk

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

def obj.method
 # method body
end
Salin selepas log masuk

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

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

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

class << obj
 code
end
Salin selepas log masuk

如果想获取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

Salin selepas log masuk

结果:

lion
cat
cat
tiger
tiger
dog
dog

dog

Salin selepas log masuk

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

AI Hentai Generator

AI Hentai Generator

Menjana ai hentai secara percuma.

Artikel Panas

R.E.P.O. Kristal tenaga dijelaskan dan apa yang mereka lakukan (kristal kuning)
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Tetapan grafik terbaik
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Cara Memperbaiki Audio Jika anda tidak dapat mendengar sesiapa
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Templat Metaprogramming dalam C++ FAQ Soalan Temuduga Templat Metaprogramming dalam C++ FAQ Soalan Temuduga Aug 22, 2023 pm 03:33 PM

C++ ialah bahasa pengaturcaraan yang digunakan secara meluas dalam pelbagai bidang Pemrograman meta templatnya ialah teknologi pengaturcaraan lanjutan yang membolehkan pengaturcara mengubah jenis dan nilai pada masa penyusunan. Metaprogramming templat ialah topik yang dibincangkan secara meluas dalam C++, jadi soalan yang berkaitan dengannya agak biasa dalam temu bual. Berikut ialah beberapa soalan temu bual pengaturcaraan templat biasa dalam C++ yang mungkin ditanya kepada anda. Apakah itu metaprogramming templat? Metaprogramming templat ialah teknik untuk memanipulasi jenis dan nilai pada masa penyusunan. Ia menggunakan templat dan metafungsi untuk menjana berdasarkan jenis dan nilai

Analisis mendalam tentang persamaan dan perbezaan antara Golang dan Ruby Analisis mendalam tentang persamaan dan perbezaan antara Golang dan Ruby Jun 01, 2024 pm 08:46 PM

Perbezaan utama antara Go dan Ruby ialah Go ialah bahasa tersusun ditaip secara statik yang menyokong keselarian ringan dan pengurusan memori yang cekap, dan sesuai untuk menulis aplikasi konkurensi tinggi Ruby ialah bahasa tafsiran ditaip secara dinamik yang menyokong keselarian sebenar tetapi pengurusan memori Ia memerlukan kawalan manual dan sesuai untuk menulis aplikasi web yang fleksibel.

Aplikasi refleksi golang dalam pengaturcaraan meta dan penjanaan kod Aplikasi refleksi golang dalam pengaturcaraan meta dan penjanaan kod May 03, 2024 pm 09:30 PM

Refleksi sangat berguna dalam pengaturcaraan meta dan penjanaan kod dalam bahasa Go: Metaprogramming: membenarkan atur cara mencipta jenis, fungsi dan pembolehubah baharu pada masa jalan dan mengubah suai struktur jenis sedia ada. Penjanaan kod: Coretan kod boleh dijana secara dinamik dan dilaksanakan pada masa jalan, seperti menjana fungsi yang melaksanakan antara muka tertentu.

Mengapakah Python, Ruby dan bahasa lain telah menghentikan pengendali kenaikan? Mengapakah Python, Ruby dan bahasa lain telah menghentikan pengendali kenaikan? May 11, 2023 pm 04:37 PM

Ramai orang mungkin melihat fenomena, iaitu, dalam beberapa bahasa pengaturcaraan moden (sudah tentu, tidak merujuk kepada bahasa pengaturcaraan "terbaru"), pengendali kenaikan dan pengurangan telah dibatalkan. Dalam erti kata lain, tiada ungkapan seperti i++ atau j-- dalam bahasa ini, tetapi hanya i+=1 atau j-=1 ungkapan sedemikian. Jawapan ini akan meneroka latar belakang dan sebab fenomena ini dari perspektif falsafah reka bentuk. Tegasnya, mungkin berat sebelah untuk mengatakan "i++ semakin hilang", kerana nampaknya hanya Python, Rust dan Swift di kalangan bahasa pengaturcaraan arus perdana tidak menyokong pengendali kenaikan dan pengurangan. Apabila saya mula-mula bersentuhan dengan Python, ini juga

Bagaimanakah metaprogramming C++ memainkan peranan dalam pengkomputeran berprestasi tinggi? Bagaimanakah metaprogramming C++ memainkan peranan dalam pengkomputeran berprestasi tinggi? Jun 01, 2024 pm 05:31 PM

Pemrograman meta C++ memainkan peranan penting dalam HPC, melalui keupayaannya untuk memanipulasi dan menjana kod, ia menyediakan alat yang berkuasa untuk mengoptimumkan prestasi dan kebolehselenggaraan kod. Aplikasi khusus termasuk: Vektorisasi SIMD: mencipta kod yang disesuaikan untuk pemproses SIMD tertentu untuk memanfaatkan keupayaan pemproses dan meningkatkan prestasi. Penjanaan kod: Gunakan templat untuk mencipta dan mengoptimumkan kod secara dinamik untuk meningkatkan kebolehselenggaraan kod. Introspeksi: Lihat dan ubah suai struktur kod pada masa jalan untuk mempertingkatkan kebolehpenyahpetasan dan fleksibiliti kod. Pengaturcaraan metadata: Proses perhubungan antara data dan metadata untuk mencapai pengaturcaraan dipacu data.

Apakah peranan metaprogramming C++ dalam memastikan keselamatan dan ketepatan kod? Apakah peranan metaprogramming C++ dalam memastikan keselamatan dan ketepatan kod? Jun 02, 2024 pm 08:17 PM

Metaprogramming boleh meningkatkan keselamatan, ketepatan dan kebolehselenggaraan kod C++ dengan ketara. Ia adalah berdasarkan keupayaan untuk memeriksa maklumat jenis dalam kod untuk melaksanakan penegasan statik. Hasilkan kod jenis selamat menggunakan metafizik templat. Pemeriksaan statik keadaan ralat dalam pengendalian ralat.

Bagaimanakah Ruby menggunakan sambungan Mysql2 untuk mengendalikan MySQL? Bagaimanakah Ruby menggunakan sambungan Mysql2 untuk mengendalikan MySQL? Apr 17, 2023 pm 10:07 PM

Ruby mengendalikan MySQL menggunakan mysql2 untuk menyambung ke mysql dan mengendalikan mysql. geminstallmysql2 menyambung ke mysql untuk mewujudkan sambungan: require'mysql2'conn=Mysql2::Client.new({host:'192.168.200.73',nama pengguna:'root',kata laluan:'P@ssword1!'}) Sambungan yang diterima pilihan termasuk: Mysql2::Clie

Penerokaan ciri bahasa Golang: penjanaan kod automatik dan pengaturcaraan meta Penerokaan ciri bahasa Golang: penjanaan kod automatik dan pengaturcaraan meta Jul 17, 2023 pm 07:33 PM

Penerokaan ciri bahasa Golang: penjanaan kod automatik dan pengaturcaraan meta Pengenalan: Golang, sebagai bahasa pengaturcaraan moden, mempunyai banyak kelebihan seperti kesederhanaan, kecekapan, dan keselarasan yang kukuh. Sebagai tambahan kepada ciri asas ini, Golang juga menyediakan beberapa ciri lanjutan seperti penjanaan kod automatik dan pengaturcaraan meta. Artikel ini akan melihat secara mendalam kedua-dua ciri dan menunjukkan penggunaannya dengan contoh kod. 1. Penjanaan kod automatik Penjanaan kod automatik ialah teknologi yang menghasilkan kod tertentu dengan menulis kod templat. Teknik ini mengurangkan pertindihan

See all articles