赞 | 3 |
VIP | 7 |
好人卡 | 12 |
积分 | 10 |
经验 | 79562 |
最后登录 | 2023-8-5 |
在线时间 | 1389 小时 |
Lv3.寻梦者 寒
- 梦石
- 0
- 星屑
- 1024
- 在线时间
- 1389 小时
- 注册时间
- 2010-8-9
- 帖子
- 3471
|
本帖最后由 寒冷魔王 于 2015-8-21 13:42 编辑
首先,对于是否必须需要学习Ruby,回答当然是“否”。
楼上的观点本人基本赞同,但是,楼上有一些没有解释到位的地方,这里用我的个人观点来阐述。
个人认为,Ruby有两个发展方向——
一个是Depth(深度),一个是Breadth(广度)。
怎么区分呢?
Depth表示学的深入,Breadth表示用途广泛。
首先,作为一门程序设计语言,Ruby是繁杂、丰富而强大的语言。Ruby具有繁杂的语法,丰富的表达方式,以及伴随着的强大的特性。
学得深意味着,你将了解更多的语言特性,更深入地理解语言层次、语法结构,掌握更多的用法和不为人知的表达方式。
举个例子来说,Ruby有个黑魔法,名字叫做“元编程”。元编程可以轻松改变Ruby的面貌。如同C++各种奇葩的模板泛型编程,在可以达到目的的同时,让你如同置身云间。
如上所说,Depth可以让你达到用Ruby玩Ruby的地步。
然而,与此同时,正因为Ruby是一门程序设计语言,它的用途是程序设计。这就是Breadth所涉及的了。
Breadth的目的在于用Ruby玩别人。——而这正是RM脚本所需要的。
程序设计,诸如制作战斗系统、绘制窗口、修改脚本等RM所常用的、有用的地方,都属于Breadth的范畴。
RM所需要的Ruby功底不深,翻一下预置脚本,就可以大致了解。
Ruby学习就像一个圆锥,最初身在锥顶,什么都不会,只能往深走。然而随着深入,可以进行的广度也就愈来愈大。Depth和Breath是相互关联的,二者相互统一。
除了喜欢用Ruby玩Ruby的兴趣爱好者外,学习Ruby的目的就是Breadth。如前所述,RM不需要太深的功力,在一定水平就可以进行Breadth。但是走Depth路线仍是不错的选择。如下是个人看法:
一、精简
我们想要构建一个Point类表示点,有x和y两个成员变量。类似C的结构体。
按照RM内置的脚本构成方式,可以这样写- class Point
- attr_accessor :x
- attr_accessor :y
- def initialize(x, y)
- @x = x
- @y = y
- end
- end
复制代码 当我们知道了','的作用,以及attr_accessor的传递方式,完全可以这样写:- class Point
- attr_accessor :x, :y
- def initialize(x, y)
- @x, @y = x, y
- end
- end
复制代码 然而实际上,如果知道Struct,这样写是最好的:- Point = Struct.new(:x,:y)
复制代码 二、正确
Ruby的参数传递采取的是引用。这一点非常重要。
如果我们不清楚这一点,可能会写出如下代码:- a = Array.new(10,0)
- b = Array.new(10,a)
复制代码 我们想要建立一个10*10的二维数组,每个元素都是0。
因为查了手册,所以我们很高兴能够看到一个简单的数组构建方法Array.new,于是我们迫不及待地采用了。
然而实际上,这个地方是有问题的。我们可以看到,b中所有子数组都变更了。这是为什么呢?
实际上,b包含的并不是10个数组,而是10个数组的引用。
由于构建对象时,Array.new传入参数是引用,而其并不采取clone方法,这使得每个引用都指向a。因此改变了a就会改变b。
正确的表达方式应该是:- a = Array.new(10,0)
- b = Array.new(10) { a }
复制代码 三、效率
对程序而言,对效率影响最大的就是算法。——这属于Breadth的范畴。
同时具有影响的,还有数据结构、程序的构建方式等。
代码示例
如上,Depth对于Breadth的作用不可忽视,深入学习Ruby对于RM脚本的掌握具有很大作用。
P.S.我才不是被茵蒂克丝吸引来的呢! |
|