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

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제









C++는 다양한 분야에서 널리 사용되는 프로그래밍 언어이다. 템플릿 메타프로그래밍은 프로그래머가 컴파일 타임에 유형과 값을 변환할 수 있도록 하는 고급 프로그래밍 기술이다. 템플릿 메타프로그래밍은 C++에서 널리 논의되는 주제이므로 이와 관련된 질문은 인터뷰에서 매우 흔합니다. 다음은 C++에서 질문을 받을 수 있는 몇 가지 일반적인 템플릿 메타프로그래밍 인터뷰 질문입니다. 템플릿 메타프로그래밍이란 무엇입니까? 템플릿 메타프로그래밍은 컴파일 타임에 유형과 값을 조작하는 기술입니다. 템플릿과 메타함수를 사용하여 유형과 값을 기반으로 생성합니다.

많은 사람들이 현상을 발견했을 수 있습니다. 즉, 일부 현대 프로그래밍 언어(물론 "최근" 프로그래밍 언어를 말하는 것이 아님)에서 증가 및 감소 연산자가 취소되는 현상입니다. 즉, 이들 언어에는 i++ 또는 j--와 같은 표현은 없고, i+=1 또는 j-=1만 그런 표현이 있습니다. 이번 답변에서는 이러한 현상의 배경과 이유를 디자인 철학의 관점에서 살펴보겠습니다. 엄밀히 말하면 주류 프로그래밍 언어 중 Python, Rust, Swift만이 증가 및 감소 연산자를 지원하지 않는 것 같기 때문에 "i++가 사라지고 있다"고 말하는 것은 편파적일 수 있습니다. 제가 처음 Python을 접했을 때도 마찬가지였습니다.

Go와 Ruby의 주요 차이점은 Go는 경량 병렬성과 효율적인 메모리 관리를 지원하는 정적으로 유형이 지정된 컴파일 언어이며 동시성 애플리케이션을 작성하는 데 적합하다는 것입니다. Ruby는 진정한 병렬성을 지원하지만 메모리 관리를 지원하는 동적으로 유형이 지정된 해석 언어입니다. 수동 제어가 필요하며 유연한 웹 애플리케이션을 작성하는 데 적합합니다.

리플렉션은 Go 언어의 메타프로그래밍 및 코드 생성에 매우 유용합니다. 메타프로그래밍: 프로그램이 런타임에 새로운 유형, 함수 및 변수를 생성하고 기존 유형 구조를 수정할 수 있도록 합니다. 코드 생성: 특정 인터페이스를 구현하는 함수 생성과 같이 코드 조각을 동적으로 생성하고 런타임에 실행할 수 있습니다.

C++ 메타프로그래밍은 코드 조작 및 생성 기능을 통해 HPC에서 중요한 역할을 하며 코드 성능 및 유지 관리성을 최적화하기 위한 강력한 도구를 제공합니다. 특정 애플리케이션에는 다음이 포함됩니다. SIMD 벡터화: 특정 SIMD 프로세서에 맞게 사용자 정의된 코드를 생성하여 프로세서 기능을 활용하고 성능을 향상시킵니다. 코드 생성: 템플릿을 사용하여 코드를 동적으로 생성하고 최적화하여 코드 유지 관리성을 향상시킵니다. 내부 검사: 런타임에 코드 구조를 보고 수정하여 코드 디버그 가능성과 유연성을 향상합니다. 메타데이터 프로그래밍: 데이터 기반 프로그래밍을 달성하기 위해 데이터와 메타데이터 간의 관계를 처리합니다.

메타프로그래밍은 C++ 코드의 안전성, 정확성 및 유지 관리성을 크게 향상시킬 수 있습니다. 이는 정적 어설션을 구현하기 위해 코드의 유형 정보를 검사하는 기능을 기반으로 합니다. 템플릿 형이상학을 사용하여 유형이 안전한 코드를 생성합니다. 오류 처리 시 오류 조건의 정적 검사.

Ruby는 mysql2를 이용해 MySQL을 동작시켜 mysql에 접속하여 mysql을 동작시킨다. geminstallmysql2는 mysql에 연결하여 연결을 설정합니다. require'mysql2'conn=Mysql2::Client.new({host:'192.168.200.73',username:'root',password:'P@ssword1!'}) 허용되는 연결 옵션은 다음과 같습니다: Mysql2::Clie

Golang 언어 기능 탐색: 자동 코드 생성 및 메타프로그래밍 소개: 현대 프로그래밍 언어인 Golang은 단순성, 효율성 및 강력한 동시성과 같은 많은 장점을 가지고 있습니다. 이러한 기본 기능 외에도 Golang은 자동 코드 생성 및 메타 프로그래밍과 같은 몇 가지 고급 기능도 제공합니다. 이 기사에서는 두 기능을 자세히 살펴보고 코드 예제를 통해 해당 기능의 사용법을 보여줍니다. 1. 자동 코드 생성 자동 코드 생성은 템플릿 코드를 작성하여 특정 코드를 생성하는 기술입니다. 이 기술은 중복을 줄입니다.
