ruby attr语言中,attr_writer :motherland 这行代码是什么意思?

Ruby语言创始人松本行弘:我为什么要开发新编程语言“Streem”_Linux新闻_Linux公社-Linux系统门户网站
你好,游客
Ruby语言创始人松本行弘:我为什么要开发新编程语言“Streem”
作者:Linux
原文刊载于《日经Linux》2015/01号中(&日经BP社 2015)。原文题为《跟Matz边做边学编程语言:21世纪的并发编程语言》。文/松本行弘,译/刘斌。
随着多核CPU的普及,shell脚本的(一部分)价值也在逐渐被我们重新认识。shell脚本的基本计算模型是基于管道来连接多个进程。如果操作系统支持多核的话,则各进程会被分配到不同的CPU上去执行,这样就可以充分发挥多核CPU的优势。同时这也证明了一点,那就是只要选择合适的计算模型,就能非常容易地实现并发执行。
在实际的业务系统中,我也听说有人采用shell脚本来进行处理。虽说是用shell脚本进行信息的筛选和加工,但是和传统的软件开发模式相比,它有着成本低、灵活性高等优点。
shell脚本已经有些力不从心
但也并不能说shell脚本有多么理想,实际上它也有它的局限性。
比如,创建OS进程的成本非常高,如果需要使用shell脚本创建大量轻量进程的话,那么在性能上将会非常不利。
还有另外一种成本,由于连接进程的管道只能发送字节数组的数据,所以发送方需要先将数据转换为字节数组,接收方则需要将字节数组还原。比如很多时候我们都会使用以逗号分隔的CSV(Comma Separated Values)格式或表示JavaScript对象的JSON(JavaScript Object Notation)格式,将数据从这些格式转换为字节数组,或者对字节数组进行解析并还原,这样做的成本是非常高的。
在进行大数据处理、高性能计算等时,我们多会选择使用多核CPU。因此,数据转换或创建进程所花费的成本是不可忽视的。这可以说是shell脚本的一个缺陷。
更进一步来说,构成管道的进程(process)所执行的命令(command),可能并不是由同一个开发者所开发的,这些命令的参数设置方法等往往并不统一,因此要想熟练使用这些命令,难度会有所增加。
21世纪的shell脚本
这样说来,如果能将shell脚本的优点,和通用编程语言的优点结合起来的话,应该就可以创造出一门非常强大的语言。
首先我们来看看这门强大的语言都需要满足哪些必要条件。
第1个条件是可以进行轻量的并发。由于不管是OS级别的进程还是线程,创建成本都很高,因此我们应该尽量避免去使用它们。比较现实的方式是在一个OS的进程中,预先生成与CPU的核数(+&)相同个数的线程,让它们轮番去执行各种操作请求。采用这种实现方式的典型语言包括Erlang和Go。在本文中,我们将相当于Erlang中的&process&、Go中的&goroutine&的概念称为&任务&(task)。
第2个条件就是解决并发执行时的竞争条件。具体来说就是&状态&的排除。也就是说,如果变量或者属性的值发生变化,就会产生一个新的状态,这也带来了因执行时机(timing)不同而产生问题的危险。所以需要将所有数据都设为不可变(immutable),这样就可以避免因执行时机而出现的缺陷。
第3个条件是计算模型。线程模型虽然应用领域非常广泛,但自由程度也很高,因此程序可能会变得难以掌控。于是我们可以参考shell的执行模型,引入一个抽象度非常高的并发计算模型。抽象度高了,反过来表现的自由度就会降低,所以在编写代码的时候就要下一番功夫。而另一方面,我们的程序也会变得非常容易调试。
新语言Streem
于是我就开始设计一门满足上述条件的新语言。由于是以流(Stream)为计算模型的语言,因此我们就将它命名为&Streem&。
首先我们来看看它的语法。由于它是基于shell的,因此也没有什么特别的语法。它的基本语法如下所示。
表达式1|表达式2|...
若要采用这种语法来实现一个从标准输入读取数据,然后输出到标准输出,功能类似于cat命令的程序,只需编写如下代码即可。
STDIN | STOUT
就是如此简单。STDIN和STDOUT是用常量表示标准输入输出的对象。Streem程序中的STDIN会从标准输入中一行一行地读取(字符串)数据,并将这一行行的数据传递给其他表达式,就像&流&一样。像这样用来表示数据的流动的对象就称为&流&(对象)。STDOUT则正相反,它是一个接收字符串参数并输出到外部(标准输出)的流。如果想读取指定文件名的文件内容的话,可以使用如下代码。
read(path)
如果是写入到指定文件,则可以使用如下代码。
write(path)
这两个方法都会返回用来读取或者写入的流对象。
Streem的表达式包括常量、变量引用、函数调用、数组表达式、Map表达式、函数表达式、运算符表达式以及if表达式。它们的语法如表1所示。如果你有其他语言的编程经验的话,这些内容应该都很容易理解。
表1 Streem的表达式
字符串常量(字面值)
数值表现形式
符号(Symbol)常量
标识符(参数...)
表达式.标识符(参数...)
ary.push(2)
数组表达式
[表达式, ...]
[表达式:表达式, ...]
[1:"2", 3:"4"], [:](空Map)
函数表达式
{|变量..| 语句 }
{|x| x + 1}
运算符表达式
表达式 运算符 表达式
if 表达式 {语句 ...} else { 语句 ...}
if true {1} else {2}
Streem中的赋值有两种方式。第一种是和其他语言类似的使用&=&的方式。
还有一种就是使用&-&&的反方向赋值的方法。如果把上面采用等号的赋值语句改为使用&-&&的话,代码将如下所示。
这种赋值方式非常适合在将管道执行结果存放到变量时使用,这样代码的顺序就能和程序的执行流程保持一致,非常方便。
不管采取上面哪种赋值方式,为了避免变量状态的改变,都需要遵循如下规则。
规则1:不能给同一个变量进行多次赋值。对一个变量的赋值在其作用域之内只能进行一次。
规则2:仅在交互执行环境的顶层作用域(top level)下,才允许对一个变量进行重复赋值。不过,你可以将这看作是对变量名相同的不同变量进行的赋值。
语句的组合
Streem支持将多条表达式语句并列编写。语句之间用分号(;)或者换行来分割。也可以认为这些语句会按照编码的顺序来执行。如果这些语句之间没有依赖关系的话,在实际执行的时候也可能会并发执行。
Streem程序示例
接下来让我们来看一些Streem程序的具体例子。
前面我们看到了一个实现类似于cat命令的例子,下面我们来看一个稍微有点不同的例子。这里我们将使用Streem来实现经常被拿来举例的FizzBuzz游戏(图1)。这个游戏要求玩家从1开始输入数字,当这个数字能被3整除的时候,会输出&Fizz&;当能被5整除的时候,会输出&Buzz&;当能同时被3和5整除的时候,则会输出&FizzBuzz&。
图1 Streem版FizzBuzz
seq(100)|{|x|if x %15==0{"FizzBuzz"}elseif x %3==0{"Fizz"}elseif x %5==0{"Buzz"}else{
seq函数用来生成一个从1到指定参数的整数数列。如果将该数列连接到管道上的话,则该数列会将各元素的值按顺序传递给管道。STDOUT则将接收到的数列的值进行输出。
从上面的例子我们可以看出,Streem的管道表述方式直接体现了要干什么,是不是更为??截了当呢?
1对1、1对n、n对m
通过图1的例子,我们已经知道了使用Streem可以非常简单地完成诸如对数值序列进行处理并输出的程序。然而现实中的程序并不完全都是对这种1对1关系的数据进行处理。比如类似于grep(单词搜索)这样&查找所有满足指定条件&的类型,以及类似于wc(统计单词数量)这样对数据进行聚合计算的类型。
Streem也支持这种应用场景,并提供了一些关键字来进行这类操作。
在一次执行需要返回多个值的时候,可以使用emit。如果给它传递多个(参数)值的话,那么它也会返回多个值。也就是说,
就相当于下面这行代码。
emit 1; emit 2
此外,如果在数组前面加上&*&的话,就表示要返回这个数组的所有元素。比如,
a =[1,2,3]; emit *a
就相当于如下代码。
emit 1; emit 2; emit 3
图2是一个使用emit的例子。这个程序会将从1到100之间的整数每个都打印两次。
图2 使用emit的例子
# 将从1到100的整数分别打印两次
seq(100)|{|x| emit x, x}| STDOUT
return用来终止函数的执行并返回值。return可以返回多个值,这时候它就相当于对多个值进行了emit操作。有一点前面我们没有提到,那就是如果一个函数主体只有一个表达式的话,那么即使不使用return,这个表达式的执行结果也会作为函数的返回值。
使用emit和return的话,就可以产生比输入值个数更多的返回值。与之相反,如果我们想生成少于输入值个数的返回值的话,则可以使用skip函数。skip用来终止当前函数的执行,但是并不产生任何返回值。图3是一个使用skip的例子,该程序用来筛选出1到100之间的偶数。
图3 使用skip的例子
skip奇数,选择偶数
seq(100)|{|x|if x %2==1{skip}; x}| STDOUT
更多详情见请继续阅读下一页的精彩内容:
相关资讯 & & &
& (11月10日)
& (09月16日)
& (12月13日)
& (09月17日)
& (09月14日)
图片资讯 & & &
   同意评论声明
   发表
尊重网上道德,遵守中华人民共和国的各项有关法律法规
承担一切因您的行为而直接或间接导致的民事或刑事法律责任
本站管理人员有权保留或删除其管辖留言中的任意内容
本站有权在网站内转载或引用您的评论
参与本评论即表明您已经阅读并接受上述条款
birdofprey 发表于 本地化组件比平台重要!!!> rubyattr_reader的困惑最近刚开始学ruby,学习过程中遇到如下问题,希望各位高手帮帮
rubyattr_reader的困惑最近刚开始学ruby,学习过程中遇到如下问题,希望各位高手帮帮
发布时间: & &
浏览:44 & &
回复:1 & &
悬赏:0.0希赛币
ruby attr_reader的困惑最近刚开始学ruby,学习过程中遇到如下问题,希望各位高手帮帮我。~~~~(&_&)~~~~
谢谢啦~我用的是ruby1.8看的pdf格式的第二版Programming Ruby对象和属性那边,其中说到attr_reader我就写了如下代码:class Song1 &attr_reader :name, :artist, :duration & def initialize(name,artist,duration) & @name = name & @artist = artist & @duration = duration & end & def to_s &
&Song: #@name--#@artist (#@duration)& & endendsong11 = Song1.new(&don't stop&,&Jolin&,256)print song11
--》song:don't stop --Jolin(256)song11.artistsong11.namesong11.duration结果只能按照to_s定义的输出歌曲的详细信息,不能通过song11.artist,song11.name,song11.duration输入歌曲的单个信息,这是为什么呢?想知道attr_reader和attr_writer的用法
attr_reader
只读attr_writer 只写attr_accessor 即可读也可写所以按你上面的代码看,要设置为第三种。wbgljy520 & &
& & (0)(0)
本问题标题:
本问题地址:
温馨提示:本问题已经关闭,不能解答。
暂无合适的专家
&&&&&&&&&&&&&&&
希赛网 版权所有 & &&&&增值电信业务经营许可证湘B2-在c语言中z--是什么意思_百度知道
在c语言中z--是什么意思
提问者采纳
是变量名吧,运行后变为9.比如运行这句前,Z值是10,Z的值自动减1,意思是这行代码执行完以后。--是后自减运算符
提问者评价
相关专业回答
C语言中的输入输出的格式说明符中没有%z这种格式。在运算规则中有一个取模运算用的是%,这时他是一个双目操作符, 如a=b%z, 表示把b除以z的余数赋值给a,这里需要注意的是%的两个操作数都必须为整形,不能为浮点数。
其他类似问题
为您推荐:
c语言的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁两天热门文章
最新推荐文章Terry七月Ruby读书笔记(比较详细)第2/4页
字体:[ ] 类型:转载 时间:
今年7月读《Ruby语言入门教程v1.0》时的读书笔记,静静地面对电脑,尝试一种新的语言,是一种淡然的快乐。
<FONT color=#8/7/13
1.&&& 消息机制:对象通过消息影响对象,对象即类的实例。谁,将被影响?
2.&&& Object:东西,物体,客体。
3.&&& Class:种类,等级,阶级;
4&&&& 动态语言:人们可以决定代码世界中一类事物的属性、方法,当然可以修改代码世界中一类事物的属性、方法,而且可以委托其它的类来修改,甚至删除。这是动态语言超越静态语言之处。由于代码是一直运行着,与其它代码一直交互着,修改、删除应该慎重,避免产生副作用。
5&&&& 封装
类名首字母要大写;
实例变量用@开头;
方法名或者参数名用小写字母或者下划线开头。
6 initialize是初始化方法
<FONT color=#.motherland="ABC"&&& #以赋值,因为有对应的setter方法。
attr_writer:motherland相当于
attr_reader:motherland相当于
def motherland=(value)
return @motherland=value
def motherland
return @motherland
attr_accessor :motherland
相当于 attr_reader:motherland; attr_writer :motherland
class 子类&父类
子类继承父类:
重写方法;
添加方法;
增强父类方法(super)。
Ruby语言已经定义了一个类Object,如果你在定义新类的时候,没有指明新类的父类,那么,Ruby解释器认为,新类的父类是 Object 类。类Object 含有new方法、initialize 方法…只要你不重写这些方法,你就自然在使用类Object 的方法。
你写一个类的时候,是在创造一类事物的蓝图;当你new的时候,一个实例就按照蓝图生成了。
Ruby没有析构函数,使用垃圾收集器自动回收实例占用的资源。
父类子类的行为差异,不同子类的行为差异,就是多态
Ruby语言,只有重写(override),没有其它语言具有的严格意义上的重载(overload)。Ruby语言有自己的单例方法,还有模块插入(Mix-in)。
http://liubin.itpub.net/post/325/15623
覆盖 override:
Overriding 也许叫做overwriting更合适,
OVERLOAD覆盖是指在子类(c++中的派生类) 中重新定义父类的函数,其函数名、参数列、返回值类型必须同父类中的相对应被覆盖的函数严格一致,覆盖函数和被覆盖函数只有函数体(花括号中的部分)不同,当派生类对象调用子类中该同名函数时会自动调用子类中的覆盖版本,而不是父类中的被覆盖函数版本。
重载(overload):
在同一个类中,出现多个同名的方法的现象就是Overload重载事发生在同一个类中,不同方法之间的现象。
在c++或者java中,方法一般为
返回类型 方法名(参数1,参数2)
判断2个方法是不是overload,主要指方法名一样,参数不一样,参数不一样指的是参数的个数,相同位置的参数的类型是否一样,而与参数(型参)的名称无关(参数类型/个数/顺序,不同),与返回类型也无关。程序会根据不同的参数列来确定需要调用的函数比如c++或者java中,这都是overload ruby中,不存在这样的overload
多态(polymorphism)
至于多态,我还没有见过一个看一眼就能明白的定义。
有的说是允许将子类类型的指针赋值给父类类型的指针,当然java中没有指针的概念。
多态有时候也被称为动态绑定或者晚绑定或运行时绑定,意思是编译的时候不必关心,运行的时候才决定调用哪个对象的哪个方法。
我觉得多态的用途之一就是在父类提供一个接口(服务),然后调用的时候用的却是子类的具体实现。
Ruby前前后后
1.动态语言
编程语言将向动态回归;
命令式语言和函数式语言将融合。
Ruby在语法层次实现了冗余。
Ruby语言的冗余性、缺陷性和动态性正是现实世界的真实写照。
2.动态变量类型
命令式语言
将操作数演化成现在我们熟悉的变量,将操作码演化成方法(或叫函数),对变量执行各种操作。
面向对象编程又将基本变量和方法封装在一起,成为一个更复杂的变量——对象。但是,在一个类中仍然区分基本变量和方法。
函数式语言
一开始的函数式语言不区分变量和方法,一切都是表(list),表就是能够不断分解成单个元素的数学符号。表可以是变量,可以是方法。
后来的有些函数式语言,吸取了命令式语言的语法,也区分变量和方法。
Ruby: 命令式语言,融合了函数式语言的语法,变量和方法区分得不很明显。
变量名,变量值,变量类型,变量的作用域;“变量名,变量值”,必要的。
动态类型语言:由编译内核(或解释内核)在运行时刻来判断变量类型的语言。弱类型语言:弱化了类型的概念,变量在运行中能够随时代表不同的事物,而不管事物是什么类型。
Ruby语言有基本类型。
纯粹的函数式语言中没有变量作用域的概念。
Ruby中有变量作用域概念,如变量名前缀字符。
实际应用中,有时会比较复杂,在使用闭包时会显现出来。
Ruby语言中,一切都是对象,变量不是对象,变量只是引用某个对象的时候的一个代号。
Ruby是动态类型语言,不用给任何变量指定数据类型,解释器会在你第一次赋值给变量时,在内部将数据类型记录下来。
Ruby语言中,一个变量被赋予了某个数据类型的值,在程序中你可以随时再赋予这个变量其它数据类型的值。
Ruby& 是在运行中检测语法,只要与语法定义不矛盾,就能通过。
Ruby& 的动态类型特点是一把双刃剑,
死盯住变量的命名。用一些有意义的名字,不必太长,但是应该少用单字符,除非是循环指针变量。在一个项目组中,程序员是要彼此相互沟通合作的。
3.改变蓝图——类
Ruby是动态语言,你可以改变Ruby程序的结构,功能。
在Ruby程序运行中,方法、属性可以被加入或去除,新的类或对象可以被建立,新的模块可以出现。
除了修改方法,添加方法,还可以除去方法。
Ruby是动态语言:灵活,强大,初学者容易犯错误;
4.编码建议
(1)&& 命名
大写,下划线分隔
类名/模块名
大写字母开头
小写,下划线分隔
变量/参数名
小写字母开头单词组合
currentValue
类名、模块名、变量名、参数名最好使用“名词”或者“形容词+名词”。
方法名最好使用“动词”或者“动词+名词”。例如:aStudent.talk。
在Ruby里,有时将“!”和“?”附于某些方法名后面。惊叹号“!”暗示这个方法具有破坏性,有可能会改变传入的参数。问号“?”表示这个方法是一个布尔方法,只会返回true或false。
(2)&& 空格
关键字之后要留空格。
逗号“,”、分号“;”之后要留空格。
“,”、“;”向前紧跟,紧跟处不留空格。
赋值操作符、比较操作符、算术操作符、逻辑操作符,如“=”、“+=”“&=”、“&=”、“+”、“*”、“%”、“&&”、“||”等二元操作符的前后应当加空格。
一元操作符如“!”、“~”等之后不加空格。
象“[]”、“.”、“::”这类操作符前后不加空格。
函数名之后不要留空格,紧跟左圆括号“(”,以与关键字区别。左圆括号“(”向后紧跟,右圆括号“)”向前紧跟,紧跟处不留空格。
(3)&& 圆括号
Ruby中圆括号常常被省略
优先规则会自动确定哪个参数被哪个方法使用。
建议除了极简单的情况,还是使用圆括号为好。
圆括号还可以把几个语句约束成一个语句集合。
<FONT color=#)&& return
在定义方法的时候,在最后一行可以显式地return某个值或几个值,但不是必须的。
Ruby方法的最后一行语句如果是表达式,表达式的值会被自动返回;最后一行语句如果不是表达式,就什么也不返回。
return不仅仅用在方法的最后一行。使用break能够跳出本层循环,如果要从多重循环体中跳出,可以使用return,结束这个方法;return还能够从方法的某个执行点立即退出,而不理会方法的其余代码。
(5)&& 注释
注释表明了一段代码块的功能、意图或是代码块的解释,应该简洁明了,错误的注释不如没有注释。一般地,注释的位置应与被描述的代码相邻,可以放在代码的上方或右方,不要放在代码的下方。
1.&&&&& 重载&重写
多态性:重写/覆盖/覆写(override) 重载(overload)
重载(overload)
重写(override)
一个类中,方法名相同、参数列表不同的几个方法,调用时根据不同的参数调用不同的方法。方法重载与返回类型无关。
子类有一个方法,方法名、参数列表、返回类型与父类的某个方法完全一致。调用时会调用子类的方法,而屏蔽掉父类的同名方法。需要注意的是,子类覆写的方法,其可访问性一定要强于或等同于,父类被覆写的同名方法。
重载不仅仅是发生在子类和父类之间,大多数时候,发生在同一个类中。
覆写发生在子类和父类之间,当然也可以是子类和父类的父类之间。
成员函数被重载的特征:(1)相同的范围(在同一个类中);(2)函数名字相同;(3)参数不同;(4)virtual 关键字可有可无。覆盖是指派生类函数覆盖基类函数,特征是:(1)不同的范围(分别位于派生类与基类);(2)函数名字相同;(3)参数相同;(4)基类函数必须有virtual关键字。
URL:http://blog.csdn.net/zgbsoap/archive//566120.aspx
Ruby语言,只有重写,没有其它语言具有的严格意义上的重载。
分析:重载,参数不同,参数列表对应位置参数类型不同。而ruby支持缺省参数、可变参数,因此,参数不同不会发生重载。所以,ruby没有严格意义上的重载。
父类和子类中的同名方法,子类重写父类。子类对象执行子类中的方法。
在同一个类中写两个同名方法,总是执行写在后面的方法。
ruby支持缺省参数,和C++相同。
在 Ruby中,我们说覆写是指重写,我们说重载也是指重写。
Ruby是动态语言,可以随时改变类的属性、方法,所以覆写和重载的重要性就降低了。
2.&&&&& 增强父类方法
如果我们只是想增强父类的方法,而不是完全地替代它,就可以用关键字super指明。
在子类定义和父类同名的函数时,加入super关键字。
3.&&&&& 变量
(1)&&&&& 稳定性
constant :Unchanging in nature, value, invariable.稳定的,不变的。
常变量(常量)。常量名用大写字母开头。
变量:作用域,可以改变值。
Ruby中的常量,可以在类和模块中定义,不能在方法中定义。
如果在外部访问类或模块中的常量,要使用域作用符::。
(2)&&&&& 作用域
全局变量——作用域程序任何位置,全局变量用$开头。
局部变量——作用域程序某个单元,用小写字母开头。
全局变量和实例变量如果没有初始化,其默认值为 nil 。
Ruby中的局部变量,可以是存在于类、方法、模块、循环、过程对象中。
(3)&&&&& 共享性
实例变量——只能被某个实例对象使用的变量,变量名用@开头;
类变量——能被某个类的所有实例对象共享的变量,变量名用@@开头。
类变量在使用前必须要初始化。
(4)&&&&& 类方法
类方法——不依赖于任何特定实例对象的方法。
类方法与实例方法的定义方式不同,定义类方法要在方法名前加上类名和点号“.”。
调用一个类方法,与定义类方法一样,要在方法名前加上类名和点号“.”。
类方法提供了一个途径,在类的外部访问类变量,无需通过类的实例方法。
对象是类的实例,说明类是对于对象的一个抽象,那么,如果把类继续抽象,把类看做实例,那它会是谁的实例?
——元类!
元数据,描述数据的数据。
疑问:类方法可否操作实例变量,而不仅仅是类变量?
4.&&&&& 单例方法
Ruby如何反映相同的类,不同实例,之间的不同的行为特征?
(1)单例方法:在Ruby里,可以给具体的实例对象添加实例方法,这个方法只属于这个实例对象,我们把这样的方法称之为单例方法,单例方法也叫作单件方法。
(2)定义单例方法:
首先要生成一个实例对象,
其次,要在方法名前加上对象名和一个点号“.”。
(3)实例方法,属于类的每个实例对象。单例方法只出现在单个实例对象中。用单例方法可以极大地丰富多态性在Ruby中的表现力。
Ruby对于类和对象的扩展,就像数学中的多维,原来只是类和对象两个层次,这里,看成任意的层次,只不过,类和对象是其中的两个不同的层次。所以,有了类的类——类的进一步抽象,有了单例方法,在对象这个层面上设计方法。
5.&&&&& 访问控制
在Ruby里,要读取或是改变对象的属性,唯一的途径是调用对象的方法。
控制了对方法的访问,也就控制了对对象属性的访问。
控制对方法的访问,有三种方式:
可以被任何实例对象调用,不存在访问控制;
可以被定义它的类和其子类访问,
可以在类中或子类中指定给实例对象;
可以被定义它的类和其子类访问,
不能被实例对象调用。
方法默认都是公有的(initialize方法除外,它永远是私有的)。
public方法
可以被定义它的类和其子类访问,
可以被类和子类的实例对象调用;
protected方法
可以被定义它的类和其子类访问,
不能被类和子类的实例对象直接调用,
但是可以在类和子类中指定给实例对象;
private方法
可以被定义它的类和其子类访问,
私有方法不能指定对象。它的类和其子类访问,
私有方法不能指定对象。
Ruby语言的访问控制是动态的,是在程序运行时刻确立的。
你可以根据自己的需要,在程序的不同位置,改变某个方法的访问控制级别,让你的程序更加富于变化。
模块化程序设计
1.&&&&& 模块
在程序中,相关的、不相关的代码的组合,叫作模块。一般情况下,我们总是把功能相关的代码放在一个模块里。
把功能相关的程序代码放在一个模块里,体现了模块的第一个作用:可以被其它程序代码重复使用。
Ruby标准包里的 Math 模块提供了许多方法
模块名.方法名(参数)
Math& 模块还提供了两个常量,圆周率π& 和自然对数底 e,
模块名::常量名
定义模块用 module...end 。模块与类非常相似,但是:
&A)& 模块不可以有实例对象;
&B)& 模块不可以有子类。
2.&&&&& 命名空间
模块的第二个作用:提供了一个命名空间(namespace),防止命名冲突。
include 模块名
定义一个模块方法,在方法名前加上模块名和一个点号“.”。
调用一个模块方法,与定义模块方法一样,要在方法名前加上模块名和一个点号“.”。模块方法提供了一个途径,在模块的外部访问模块内部方法,无须 include模块。定义模块常量不需要如此。
3.&&&&& 糅和(Mix-in)与多重继承
柔和/混合插入/Mix-in
Ruby是单继承,通过Mix-in模块,实现多重继承的优点。
模块的第三个作用:实现了类似多重继承的功能。
通过“&父类名”,一个子类可以得到父类的属性和方法;
通过“include模块名”,一个子类可以得到某个模块的常量和方法。
类不能被include。
include方法为一个类的所有对象包含某个模块;
extend方法为一个类的某个对象包含某个模块(联系单例方法)。
4.&&&&& require和load
require方法包含另一个文件,另一个文件名需要是一个字符串。
load方法与require方法相对应,也用来包含另一个文件。
require包含文件,只加载一次,遇到同一文件时自动忽略;不同路径下的同名文件会多次加载。
load包含文件,加载多次,即使是相同路径下同一文件。
总结一下:
require,load
include,extend
加载文件一次
加载文件时可以不加后缀名
一般情况下用于加载库文件
加载文件多次
加载文件时必须加后缀名
用于加载配置文件
利用load多次加载文件的特性,可以用来实现程序的无缝升级和系统的热部署。程序功能改变了,你只需要重新load一次,其它代码与它再次交互的时候,这个程序实际上已经不是原来的程序了。
当前2/4页&
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具

我要回帖

更多关于 ruby语言入门 的文章

 

随机推荐