Ruby - 字符串

Ruby 中字符串类类型为String, Ruby 2.0 默认使用unicode字符集,所以可以直接操作UTF-8字符串,无需转码。 > "Hello world".class => String > '中国'.encoding.to_s => "UTF-8" 字符串赋值 字符串赋值(定义)用双引号或者单引号包含起来: x = "A string" y = 'A String' 多行字符串可以用 %q{} 包含,例如: z = %q{This is a good project. Just fork it. } 其中%q是固定格式,{} 可以替换为其它成对符号,例如: <> ## !! 等 Ruby Doc 文档模式的字符串使用方法如下: x = <<END_MY_STRING This is the first string And the second line END_MY_STRING 其中END_MY_STRING可以自定义,当然必须以此结尾。 注意,多行字符串中的内容中间不能有边界符号,例如{},<>,或者自定义的服务,否则会导致错误。 快速定义字符串数组 使用 %w{}可以快速定义数组,例如……

阅读全文

Ruby - 类与对象

Ruby中定义一个类非常简单: class Person end Ruby中所有类都自动继承自Object类。 通常类的名称是大写字母开头。类总是存在一个默认空参数的构造函数: def initialize end 实例化一个类对象使用new方法,例如: person = Person.new 作为一个对象,当然有其变量(属性)和方法。先从变量开始。 各种变量 Ruby中有四种变量:局部变量、全局变量、对象变量、类变量。 Ruby的变量有前缀的说法,这不同于其它语言的变量。 局部变量 类似于Java、Ruby等其它语言一样,局部变量只能适用于代码块内, 一旦离开了局部变量定义的代码块就失效了。例如:方法内、代码块内等。 局部变量的定义和其它语言一样,没有前缀,例如: x = 10 p = Person.new 全局变量 全局变量一旦定义后可以在程序的任何地方进行访问,很显然这个面向对象的思想冲突。 因此全局变量在Ruby中使用不多。 全局变量有前缀$,使用方法如下: $VERSION = [1,2,0] puts $VERSION 对象变量(实例变量) 对象变量也成为类实例变量,它的作用域关联于对象的生命周期,同Java/Python中的对象变量。 对象变量有前缀@,例如: class Person def initialize(name='',age=0) @name = name @age = age end def to_s "#{@name}, #{@age}" end end p = Person.new('Ady Liu',29) puts p.to_s => Ady Liu, 29 默认情况下,是不能通过 p.……

阅读全文

Ruby - 重写与重载

重写(Override)和重载(Overload)是Java里面比较强大的特性,可惜却比较笨重。 重写和重载值针对类方法的。 重载与重写 重载定义: 类或者子类中,方法名相同、参数列表不同的方法。 调用时根据参数的不同调用不同的方法,与返回值无关。 重写定义: 子类中,方法名、参数列表、返回值与父类完全一致。 这里完全一致是说子类的方法的可见性、参数类型、返回值类型要强于或者等于 父类的访问性、参数列表、返回值。 事实上,Ruby和Python类似,没有严格意义上的重载定义,只有重写。 也就是说同类或者子类中不允许有同名的方法。那如何完成重载的功能呢? Java中重载有三种定义: 1. 参数个数不同, call(int a) 与 call(int a, int b) 2. 参数类型不同, call(int a) 与 call(float b) 3. 参数位置不同, call(int a, string b) 与 call(string a, int b) 而ruby和python一样使用如下特性来解决重载的问题: 缺省参数解决参数个数问题 动态参数类型解决参数类型和位置不同问题 可变参数也能解决Java中的可变参数以及参数问题 例如: def call(a,b='',c=0,*num) end Python中类似结构为: def call(a,b='',c=0,*num): pass 矛和盾总是有冲突的,动态参数类型增强了方法重载的能力,但同时也扩大错误使用的风险。……

阅读全文

Ruby 语法快速入门

关于代码 单行注释使用#开头,和python类似 多行注释使用=begin开始, =end结束,需要注意的是 =begin 和 =end 必须顶格写(行首),不能有空白符 分号; 表示一个语句的结束,一行如果有多个语句每个语句用分号隔开,最后一个语句可以省略分号,和python类似 行连接符使用’'结尾,和python类似 关于标识名 标识名区分大小写 局部变量、方法参数、方法名称应该使用一个小写字母或者_开头 全局变量用美元符号$开头 实例变量(对象变量)应该使用@开头 类变量(静态变量)应该使用@@开头 类名称、模块名称、常量应该使用大写字母开头 关于数据类型 数据类型有:数字、字符串、数组、哈希表、区间,正则表达式(类型python中 int/double、str、list、dict、range、regex) 数字有整数型和浮点型 字符串在’'(单引号)、""(双引号)之间的代码 数组类似python中list,应该可以存放不同类型的元素 区间用..或者…表示,前者包括左右边界,后者仅包括左边界 除了false和nil当作false以外,其它任何对象都当作true,这和python很不一样 赋值 同Python一样,动态类型不用预先定义类型,运行时自动检测类型。例如: a=1; a,b=b,a a,b,c=1,3,5 没有++,-- 运算符,可以用+=或者-= 条件运算符 条件运算符比较复杂,有一些比较特别的运算符。 == 比较两个对象的值是否相等,例如,a=1;b=1.0; (a==b) == true != 比较两个对象的值是否相等,例如,a=1;b=1.0; (a!=b) == false eql? 比较两个对象的值和类型是否相等,例如,上述 a.eal?(b) == false equal? 比较两个对象的内存地址是否相同,和java的默认Object比较类型 <=> 比较两个对象的大小,分别返回 1,0,-1,类似java的Comparable接口 =~ 用来比较字符串是否符合一个正则表达式,返回模式在字符串中匹配的位置,无匹配返回nil !~ 断言字符串不符合一个正则表达式,返回true,false 条件判断语句 单行 if 语句 单行if语句有两种语法……

阅读全文

Ruby学习笔记

一直对Ruby不大感冒,但每天抽出一点时间来学习是一个锻炼毅力不错的办法,坚持下来总是有收获的。 于是决定从头开始学习Ruby,最起码能够自己维护和扩展这个Octopress的Blog。 又或者和Python对比着学习。 语法快速入门 重写与重载 编码规范 字符串 类与对象 Object类 模块 文件操作 异常体系 HTTP操作 Socket操作 ……

阅读全文

Ruby编码规范(建议)

Ruby由于是动态语言,如果代码没有规范将会带来很高的维护成本。 关于命名 常量全部用大写字母,多个单词用下划线分隔 类名和模块名称用大写字母开头,驼峰式命名 方法名全部用小写字母,下划线分隔。另外方法名称后面可能跟着?和!. ?表示此方法仅返回boolean值true/false,!表示此方法可能会改变输入参数的值,具有破坏性。 变量和参数可以用小写字母开头,驼峰式或者下划线分隔都可 类名、模块名、变量、参数最好用名词或者“形容词+名词”,方法名最好是动词或者“动词+名称”。 关于空格和小括号 关键字之后要留空格 逗号(,)和分号(;) 之后要留空格,前面无须留空格 比较操作符、复制操作符、算术操作符、逻辑操作符前后应当留空格 一元操作符(!~) 前后无须留空格 ‘[]'、'.'、'::‘等无须留空格 函数名后面如果跟着小括号()就不留空白 如果可以,尽可能的使用小括号,减少歧义 尽可能的使用return语句 类似于python,ruby的方法最后一条语句如果有返回值自动当作方法的返回值,如果没有返回值,那么方法就没有返回值。 显示的使用return有很多好处: 明确告知方法返回的结果 提前中断方法返回 跳出多重循环或条件 最后的最后,注释当然是必不可少的,详细不罗嗦,清晰不简单。……

阅读全文