Ruby入门笔记 (九) 之动态特性
1、数组和散列很有用
Code
2、关于正则表达式的应用,看12.5
String#scan, String#split, String#sub/sub! gsub/gsub!, grep非常方便,is very powerful。
3、Ruby中的一切都是动态的,我对动态的理解是Ruby对象和类的各种运行时的修改、改变和拦截的能力。
贴一个权威一点的解释:
4、单例方法是指在特定对象上添加的方法称为该对象的单例方法。
比如 obj = Object.new; def obj.talk; puts "Hi!" end; obj.talk;
Ruby语言设计的特点之一就是具有为单个对象定义行为的能力。只要设计的原因?
还记得前面那个例子吗:
a. ticket = object.new
看一个新例子:
单例类:
Code
结果:Hello
5、eval方法族(待深入研究)
Code最有用的eval族方法:class_eval
可以做class关键字不能做到的事情:
A、在类定义的上下文中对字符串求值。
B、为匿名类(但不包含单例类)打开类定义
C、获取外围作用域中变量的访问权.
Code
class_eval
6、可调对象(callable object)
Code
7、回调方法和钩子方法是相当常见的元编程技术(meta-programming)。
Code
结果:There's no method called anything here -- please try again.
This module supplies this instance method.
E just got subclassed by F
A is undefined-setting it to 1.
1
1
8、覆盖和增加核心功能:如果要改变Ruby的核心行为,必需非常非常小心。保证安全的唯一方法就是改变核心方法。

2、关于正则表达式的应用,看12.5
String#scan, String#split, String#sub/sub! gsub/gsub!, grep非常方便,is very powerful。
3、Ruby中的一切都是动态的,我对动态的理解是Ruby对象和类的各种运行时的修改、改变和拦截的能力。
贴一个权威一点的解释:
(1)动态类型语言:动态类型语言是指在运行期间才去做数据类型检查的语言,也就是说,在用动态类型的语言编程时,永远也不用给任何变量指定数据类 型,该语言会在你第一次赋值给变量时,在内部将数据类型记录下来。Python和Ruby就是一种典型的动态类型语言,其他的各种脚本语言如 VBScript也多少属于动态类型语言。
(2)静态类型语言:静态类型语言与动态类型语言刚好相反,它的数据类型是在编译其间检查的,也就是说在写程序时要声明所有变量的数据类型,C/C++是静态类型语言的典型代表,其他的静态类型语言还有C#、JAVA等。
对于动态语言与静态语言的区分,套用一句流行的话就是:Static typing when possible, dynamic typing when needed。
4、单例方法是指在特定对象上添加的方法称为该对象的单例方法。
比如 obj = Object.new; def obj.talk; puts "Hi!" end; obj.talk;
Ruby语言设计的特点之一就是具有为单个对象定义行为的能力。只要设计的原因?
还记得前面那个例子吗:
a. ticket = object.new
def ticket.venue
"New York" 单例方法(第七章深入)
end singleton method
b. class Ticket
def ticket.venue
"New York" 实例方法:在类中定义、供类的所有实例使用的方法
end
end看一个新例子:
str = "hello"
class << str // <<str记法表明是str的单例类
def twice
self + " " + self
end
end
def str.twice
self + " " + self
end
效果是一样的,但是二者的差别在于前面的例子打开了str的单例类并在其中定义方法(这两种定义单例方法的办法还有一个微妙的差别,及涉及常量的作用域,在大多数情况下,可以认为等价的)。class << str // <<str记法表明是str的单例类
def twice
self + " " + self
end
end
def str.twice
self + " " + self
end
单例类:

结果:Hello
class D
include M
end
class << D
p ancestors
end
结果:[Class, Module, Object, Debugger::DBGP::Constants, PP::ObjectMixin, Kernel]include M
end
class << D
p ancestors
end
5、eval方法族(待深入研究)

可以做class关键字不能做到的事情:
A、在类定义的上下文中对字符串求值。
B、为匿名类(但不包含单例类)打开类定义
C、获取外围作用域中变量的访问权.


6、可调对象(callable object)

7、回调方法和钩子方法是相当常见的元编程技术(meta-programming)。

结果:There's no method called anything here -- please try again.
This module supplies this instance method.
E just got subclassed by F
A is undefined-setting it to 1.
1
1
8、覆盖和增加核心功能:如果要改变Ruby的核心行为,必需非常非常小心。保证安全的唯一方法就是改变核心方法。