`
swachian
  • 浏览: 75174 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

笔记3 --- 接近实质

阅读更多

 

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?

 

 

 

 

 

 

分享到:
评论

相关推荐

    张宇高等数学笔记-基础知识

    根据提供的标题“张宇高等数学笔记-基础知识”与描述“张宇的高数基础知识讲义,适合在学习人工智能之前补充数学基础”,我们可以了解到这是一份关于高等数学的基础知识讲义,旨在为准备学习人工智能的学生提供必要...

    js3笔记.rarjs3笔记.rar

    5. **类与继承**:ES6引入了基于原型的类语法,提供了更接近传统面向对象编程的写法,但本质仍是函数和原型。 6. **模块系统**:通过import和export关键字实现模块化,便于代码组织和复用。 7. **Promise**:处理...

    GAN学习笔记

    - 生成器\( G \)接收合成图像而非随机噪声作为输入,学习如何将合成图像转换为更接近真实图像的样式。 - SimGAN为利用大量低成本合成数据进行模型训练提供了一种有效途径。 #### 十三、创意生成对抗网络(Creative...

    c++ 完全学习笔记

    总的来说,《C++完全学习笔记》提供了全面的C++学习资源,不仅涉及编程语言的基础知识,还包括了软件开发的先进理念,有助于读者深入理解编程的本质,提升编程技能,适应现代软件开发的需求。在学习过程中,读者将...

    Linux云计算 运维架构师学习笔记

    JSP文件本质上是一个Servlet,但在编写时更接近HTML文档。 ##### Tomcat部署方式 Tomcat可以根据实际需求采用不同的部署方案: - **方案一**: 单个Tomcat实例部署。适用于小型项目或测试环境。 - **方案二**: ...

    2021年注册安全工程师安全技术笔记个人总结.pdf

    本质安全是机械安全技术的一种重要组件,旨在消除机械设备中的危险因素,减少和消除接触次数,使人难以接近,提供保护装置,个体防护等。 保护操作者 机械安全技术中需要保护操作者,例如培训提高便是危险能力、...

    Java学习笔记(必看经典)

    ### Java学习笔记(必看经典) #### 面向对象基础 面向对象编程(OOP)是一种编程范式,它强调将程序设计成一系列相互交互的对象。面向对象的主要优点包括易于理解、可重用性和模块化。 **面向过程与面向对象** - **...

    《双赢谈判》经典笔记.docx

    #### 序言:商业运作的本质 - **商业成功的关键**:商业的成功不仅依赖于高层领导的战略决策,更重要的是来自一线销售人员的努力与智慧。每天,无数销售人员通过交流、培训和自我提升等方式,推动着商业活动的发展...

    2021年一级造价师管理-核心笔记.pdf

    多次性是指多次计价是一个逐步深化和细化,不断接近实际造价的过程。组合性是指分部分项工程造价→单位工程造价→单项工程造价→建设项目总造价。方法的多样性是指投资估算、概预算造价、单价法和实物法等多种方法。...

    自己在学习FOC过程中的一些笔记,包括了FOC几大变换的数学推导,SVPWM的过程,也包括PID,积分抗饱和,磁链圆限制

    FOC(Field-Oriented Control)的本质与核心思想** FOC(Field-Oriented Control)是一种先进的电机控制策略,其核心思想是通过实时控制电机的定子磁场,使其始终与转子磁链保持90度的相位差,以实现最佳的转矩...

    某电子集团笔记本电脑市场推广销售方案.pptx

    电子集团的目标消费群体主要是年龄在20-35岁之间,男女比例接近1:1的个人用户,包括大学生、普通职员、高级白领、中小企业管理层和自由职业者。他们月收入超过2500元(学生除外),追求新事物,接受速度快,渴望实现...

    走近教育大师读书笔记.doc

    书中所涉及的教育家们的见解,让我认识到教育的本质。从古代的孔子到近代的蔡元培,从西方的苏格拉底到现代的苏霍姆林斯基,每一位大师都以不同的方式揭示了教育的深层含义。教育不仅是传授知识,更重要的是塑造一个...

    GAN原理笔记1

    GAN原理笔记1 GAN(Generative Adversarial Networks)是一种深度学习算法,用于生成新的、类似于真实数据的样本。它由两部分组成:生成器(Generator)和判别器(Discriminator)。生成器的目标是生成尽可能接近...

    《ASSET MANAGEMENT》读书笔记(4):关于因子配置和策略研究的一些思考1

    因子配置的思路是从超越单一资产的角度去考虑风险分配,因为每类资产可能由多个共同的风险因子驱动,这样通过因子配置可以获得更高的多元化程度,更接近风险定价的本质。 策略研究,例如价值投资、趋势跟踪或波动率...

    一些有关jsp的课堂笔记

    JSP页面本质上是Servlet的一种简单扩展,但在语法形式上更接近于HTML。 ### 内置对象 JSP提供了多个内置对象,这些对象可以直接在JSP页面中使用而无需显式声明。主要包括以下几种: - **PageContext**: 是一个...

    Eloquent-[removed]来自 Eloquent JavaScript 的笔记

    - 类与ES6语法:ES6引入了类的概念,但实质上仍基于原型继承,提供了更面向对象的语法糖。 3. **数组与字符串** - 数组方法:数组提供了一系列内置方法,如push、pop、shift、unshift、slice、splice等,用于操作...

    notes:我的个人笔记

    - async/await:基于Promise的语法糖,使异步代码更接近同步写法。 7. **ES6及后续版本的新特性** - 类(class):提供面向对象编程的语法糖,但本质仍是函数和原型。 - 解构赋值:允许从数组或对象中提取值,赋...

    Modeling Our World读书笔记

    第一章"Object Modeling And Geodatabases"(对象建模和地理数据库)探讨了地理数据模型的本质,这是一种在GIS中模拟现实世界的表示,用于生成地图、执行查询和分析。随着数据库和软件技术的进步,新的地理数据模型...

    软考中级信息系统管理工程师复习笔记干货.docx

    控制器是指挥、协调计算机各大部件工作的指挥中心,实质是解释、执行指令。CPU 能够按正确的时序产生操作控制信号是控制器的主要任务。 存储器是计算机系统中的重要部件,用来存放计算机运行时的大量程序和数据。...

Global site tag (gtag.js) - Google Analytics