Ruby预览

1. 第一个Ruby程序

今天的第一道程序不是Hello World。而是定义一个类。

class Greeting
  def initialize(text)
       @text = text
  end

  def welcome()
    @text
  end
end

# 创建一个Greeting类的实例
my_object = Greeting.new "Hello"
p my_object.class
p my_object.class.instance_methods(false)
p my_object.instance_variables

上面的代码我们定义了一个类Greeting,并且创建对象,在后面运用内省的机制访问

  1. 对象所属的类。
  2. 类中含有的实例方法。
  3. 实例变量。

打印结果如下:

Greeting
[:welcome]
[:@text]

跟Python的一点不同,Ruby中函数调用是可以忽略()的,而Python里面只有print语句是不需要加入(),(Python3已经修复了这个问题,必须要加上().)。-_-其实那时候我选Python2就是因为看到方法调用不需要加括号我就果断选了Python2了。

不过考虑到可读性,建议,如果是调用带有参数的方法调用都加入括号。

2. Ruby的各种命名简解

Ruby中的变量定义(Learn from Perl)
  • $开头:全局变量
  • @开头:实例变量
  • @@开头:类变量, 类变量被共享在整个继承链中
  • 大写字母开头:常数

这个规则是从Perl语言来的启发。通过特殊符号来区分不同类型的变量有助于提高程序的可读性。

规定类名和模块名必须首字母大写

由于在Ruby里面类名一旦定义便一般不会再修改。所以它的机制是认为命名应该是常量。否则会报错。

# 定义小写字母开头的模块名
ruby(main):018:0> module a
ruby(main):019:1> end
SyntaxError: (ruby):18: class/module name must be CONSTANT
from /usr/bin/ruby:12:in `<main>'
# 定义小写字母开头的类名
ruby(main):020:0> class a
ruby(main):021:1> end
SyntaxError: (ruby):20: class/module name must be CONSTANT
from /usr/bin/ruby:12:in `<main>'
# 如果对一个常量进行赋值的话会报警告。但是还是可以修改
ruby(main):023:0> RU = 2
=> 2
ruby(main):024:0> RU =12
(ruby):24: warning: already initialized constant RU
(ruby):23: warning: previous definition of RU was here
=> 12
方法名也可以带特殊符号

Ruby 的方法命名是可以带一些特殊的符号。(这个特性据说是从Lisp学的)。
我们最熟悉的判断一个数是奇数还是偶数:

[9] pry(main)> a = 12
=> 12
[10] pry(main)> a.even?
=> true

由于在Ruby里面一切都是对象,所以这里的12甚至可以直接调用

[30] pry(main)> 12.even?
=> true

这里很有意思的是方法名可以加上问号,这可以用来识别一些返回true or false的方法。团队合作的时候一看,就知道这个方法是用来进行逻辑判断的。这也挺好的。不过只能放在最后面。

这样的事情发生在Python里面就很不可思议了。Python方法名是不接受这类定义的。

3. 链条式的调用

Ruby是一门十分灵活的语言,又得益于它的不需要括号来调用函数的特性,我们可以写出这种代码

[37] pry(main)> a = "heng"
=> "heng"
[38] pry(main)> a.methods.grep /cat/
=> [:concat]

这里是要查找出字符串里面的所有方法中包含关键字cat的方法名(返回的是一个数组),这里用了正则匹配。这是一个我比较喜欢的地方。 而像 a.methods.grep 顺着读,没有括号在中间的那种违和感。感觉就是在读英文。由于这种简练语法这门语言在国外有不少的爱好者。

当然grep只是数组的内置函数

[40] pry(main)> a.methods.class
=> Array
[41] pry(main)> Array.instance_methods.grep /grep/
=> [:grep]

所以只要返回的是对象,并且参数是可以为空的话,这条链可以很长很长。
比如你要看字符串类型的祖先可以这样。

[42] pry(main)> string = "I'm String"
=> "I'm String"

[45] pry(main)> string.class
=> String
[46] pry(main)> string.class.superclass
=> Object
[47] pry(main)> string.class.superclass.superclass
=> BasicObject
[48] pry(main)> string.class.superclass.superclass.superclass
=> nil

这个BaseObject是Ruby里面最基本的类了。人们叫他白板类。它的实例方法只有很少的几个。不过在某些环境下是十分有用的。

[12] pry(main)> BasicObject.instance_methods
=> [:==, :equal?, :!, :!=, :instance_eval, :instance_exec, :__send__, :__id__, :__binding__]

如果再继续就会报错了。因为nilsuperclass会抛出异常。

NoMethodError: undefined method `superclass' for nil:NilClass
from (pry):52:in `__pry__'

这个错误看似没用。其实会触发一些很好玩的机制。Ruby设置了不少的钩子,我们通过这些钩子可以做很多好玩的事情,这在后面介绍动态方法的时候会继续拓展。

Happy Coding!! _

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,271评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,275评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,151评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,550评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,553评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,559评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,924评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,580评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,826评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,578评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,661评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,363评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,940评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,926评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,156评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,872评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,391评论 2 342

推荐阅读更多精彩内容