1. Duck Typing
A. 无类型语言
不伤害reliablity 但增加productivity
So even in Java, the class is not always the type—sometimes the type is a subset of the
class, and sometimes objects implement multiple types.
Duck typing: The type of an object is determined by what it can do(behavior), not by its class.
If an object walks like a duck and talks like a duck, then the interpreter is happy to treat it as if it
were a duck.
B. Standard Protocols and Coercions
惯例协议:
1. to_s, to_i
2. to_str, to_int 严格
3. number coercions(coerce)数字的转换由class定,并且可以把参数考虑进来
A class definition is executable code.
scope operator ::
module和class可嵌套定义
2. Classes and bjects
A. 模型
A Ruby object has three components: a set of flags, some instance variables, and an
associated class. A Ruby class is an object of class Class, which contains all the object
things plus a list of methods and a reference to a superclass (which is itself another
class). All method calls in Ruby nominate a receiver (which is by default self, the
current object). Ruby finds the method to invoke by looking at the list of methods in
the receiver’s class.If it doesn’t find the method there, itlooks in any included modules,
then inits super class, modules in the superclass, and then in the super class’s superclass,
and so on.If the method cannot be found in the receiver’s class or any of its ancestors,
Ruby invokes the method method_missing on the original receiver.
virtual class 是针对每个object单建的。
一个object的class如果再度被open,那将不会再新建一个virtual class,只是修改已经建好的这个中的内容。
每include一个module,就会在super链中增加一个proxy class,这个proxy的superintendent指向Object或其他proxy,而proxy的method和instance变量都指向同一个Module中的内容。module不会多建,而proxy会有很多个,并且形成一个链。后加入的插在前面。Proxies位于Class和Object中间。
B. Class and Module Definitions
In Ruby,class and module definitions are executable code.
也就是class和module都是可以动态定义的,和编译好的语言大不相同。
Top-Level Execution Environment 就是Object的实例,所以调用puts等于调用self.puts.
3. Reflection
通过反射发现:
A. 包含的objects
ObjectSpace.each_object() {|x|}
B. class hierarchy
klass.superclass
klass.ancestors 同时还会列出混入的mixin module
C. attributes and methods of object
local_variables
o.instance_variables 执行过的函数后,会有对应的实例变量添加其中
c.class_variables
c.constants
o.methods
o.respond_to?("frozen?")
o.id
o.class
o.kind_of? Fixnum
o.instance_of? Numeric
E. 动态调用method的3种方法
1. o.send(command_string, params)
2. Method object
method = "sss".method(:length)
method.call
UnboundMethod , bind给某个object
3. eval会分析并执行一段合法的ruby代码
trane = %q{"sss".length}
eval trane
性能来说,eval慢许多。
require 'benchmark'
include Benchmark
test = "Stormy Weather"
m = test.method(:length)
n = 100000
bm(1) {|x|
x.report("call") { n.times { m.call } }
x.report("send") { n.times { test.send(:length) } }
x.report("eval") { n.times { eval "test.length" } }
}
F. System hooks 允许改变已存在函数的行为
1. 利用class-open原则,alias_method老的method,重新定义同名的method。
2. callback methods
singleton_method_added 还考虑给某个具体的实例变量增加的method
method_added 针对open一个class时
增加class method时,singleton_method_added 会被通知两次。singleton包含特殊(某个object)的意思。
调用caller得到如何到此的一个call stack(string 组成的 array)
G. YAML for Marshalling
实现to_yaml_properties方法,require yaml.
调用YAML.dump(obj)获取数据,调用YAML.load(data)还原数据。
"compile time” and “runtime.”are all the same. You can add code to a running process.
You can redefine methods on the fly, change their scope from public to private, and
so on. You can even alter basic types, such as Class and Object.
Once you get used to this flexibility, it is hard to go back to a static language such as
C++ or even to a half-static language such as Java.
But then, why would you want to do that?
分享到:
相关推荐
根据提供的标题“张宇高等数学笔记-基础知识”与描述“张宇的高数基础知识讲义,适合在学习人工智能之前补充数学基础”,我们可以了解到这是一份关于高等数学的基础知识讲义,旨在为准备学习人工智能的学生提供必要...
5. **类与继承**:ES6引入了基于原型的类语法,提供了更接近传统面向对象编程的写法,但本质仍是函数和原型。 6. **模块系统**:通过import和export关键字实现模块化,便于代码组织和复用。 7. **Promise**:处理...
- 生成器\( G \)接收合成图像而非随机噪声作为输入,学习如何将合成图像转换为更接近真实图像的样式。 - SimGAN为利用大量低成本合成数据进行模型训练提供了一种有效途径。 #### 十三、创意生成对抗网络(Creative...
JSP文件本质上是一个Servlet,但在编写时更接近HTML文档。 ##### Tomcat部署方式 Tomcat可以根据实际需求采用不同的部署方案: - **方案一**: 单个Tomcat实例部署。适用于小型项目或测试环境。 - **方案二**: ...
本质安全是机械安全技术的一种重要组件,旨在消除机械设备中的危险因素,减少和消除接触次数,使人难以接近,提供保护装置,个体防护等。 保护操作者 机械安全技术中需要保护操作者,例如培训提高便是危险能力、...
### Java学习笔记(必看经典) #### 面向对象基础 面向对象编程(OOP)是一种编程范式,它强调将程序设计成一系列相互交互的对象。面向对象的主要优点包括易于理解、可重用性和模块化。 **面向过程与面向对象** - **...
#### 序言:商业运作的本质 - **商业成功的关键**:商业的成功不仅依赖于高层领导的战略决策,更重要的是来自一线销售人员的努力与智慧。每天,无数销售人员通过交流、培训和自我提升等方式,推动着商业活动的发展...
多次性是指多次计价是一个逐步深化和细化,不断接近实际造价的过程。组合性是指分部分项工程造价→单位工程造价→单项工程造价→建设项目总造价。方法的多样性是指投资估算、概预算造价、单价法和实物法等多种方法。...
FOC(Field-Oriented Control)的本质与核心思想** FOC(Field-Oriented Control)是一种先进的电机控制策略,其核心思想是通过实时控制电机的定子磁场,使其始终与转子磁链保持90度的相位差,以实现最佳的转矩...
《走近教育大师》这本书汇集了47位国内外知名教育家的思想精华,让我们有机会倾听他们的智慧之声,提升我们对教育的理解...通过深入阅读,我们可以更接近那些教育的大师,从他们的智慧中汲取力量,让教育变得更加美好。
电子集团的目标消费群体主要是年龄在20-35岁之间,男女比例接近1:1的个人用户,包括大学生、普通职员、高级白领、中小企业管理层和自由职业者。他们月收入超过2500元(学生除外),追求新事物,接受速度快,渴望实现...
实现财务自由的【1-2-3-4-5纲领】第一条就是重视拥有生钱资产。投资者应当寻找那些具有稳定盈利能力、能持续分红的公司或项目进行投资,以获取持续的现金流入。这需要投资者具备识别优质资产的能力,理解公司的基本...
GAN原理笔记1 GAN(Generative Adversarial Networks)是一种深度学习算法,用于生成新的、类似于真实数据的样本。它由两部分组成:生成器(Generator)和判别器(Discriminator)。生成器的目标是生成尽可能接近...
因子配置的思路是从超越单一资产的角度去考虑风险分配,因为每类资产可能由多个共同的风险因子驱动,这样通过因子配置可以获得更高的多元化程度,更接近风险定价的本质。 策略研究,例如价值投资、趋势跟踪或波动率...
JSP页面本质上是Servlet的一种简单扩展,但在语法形式上更接近于HTML。 ### 内置对象 JSP提供了多个内置对象,这些对象可以直接在JSP页面中使用而无需显式声明。主要包括以下几种: - **PageContext**: 是一个...
- 类与ES6语法:ES6引入了类的概念,但实质上仍基于原型继承,提供了更面向对象的语法糖。 3. **数组与字符串** - 数组方法:数组提供了一系列内置方法,如push、pop、shift、unshift、slice、splice等,用于操作...
- 意识的本质:意识是对客观存在的主观反映,其内容是客观的,形式是主观的。 - 意识的能动性体现在人能动地认识世界和改造世界。人们在意识的指导下能动地改造世界,通过实践将观念变为现实,创造出新的事物。 -...
- async/await:基于Promise的语法糖,使异步代码更接近同步写法。 7. **ES6及后续版本的新特性** - 类(class):提供面向对象编程的语法糖,但本质仍是函数和原型。 - 解构赋值:允许从数组或对象中提取值,赋...