大写字母开头,如 Array、Enumerable 都是 常量。常量的意思是这个名称和某个对象的联系是固定了的,但不表示那个对象不可更改, 如: Foobar = [ 1, 2, 3 ] Foobar[2] = 99 print Foobar # [1, 2, 99] 要想常量所指的对象不可修改,那应该 Foobar = [ 1, 2, 3 ].freeze Q:STDIN、STDOUT、STDERR 和$stdin、$stdout、$stderr 有什么区别? STDIN 这一类以大写字母开头,是常量;$stdin 这一类以$开头,是全局变量。
常量不可变,STDOUT 总指向屏幕显示(除非运行 ruby 时在命令行设置>out 2>err 之类) ,变 量可变,所以$stdin 可以替换成别的 IO/File 对象。 全局
的输出方法,如 print puts 等,总是向$stdout 输出,而非向 STDOUT 输出,如: print 1 # 这时$stdout 和 STDOUT 是一致的,输出到屏幕 $stdout = open('output_file','w') print 2 # 这时输出到 output_file 了 $stdout = STDOUT print 3 # 又输出到屏幕了 Q:ARGV = ["a","b","c"]的写法为什么会报错? Perl 里写@ARGV = qw(a b c)和 Python 里写 sys.argv = ["a","b","c"]都是 OK 的 Ruby 这么写报错的原因其实也很简单,因为 ARGV 以大写字母开头,所以它是个常量,ruby 解析器一启动,ARGV 常量就设置好了,再用等号赋值的方式,表示你想改变这个常量跟某 个对象之间的联系,对常量来说这是不行的 所以在 Ruby 里得写成 ARGV.replace ["a","b","c"],replace 是 Array 类的一个实例方法,表示 不改变对象,只替换内容 Q:表示"什么都没有",用什么?null undef nil? 用 nil。Perl 里用 undef 表示什么也没有,但在 Ruby 里,undef 是取消方法定义的关键词。 Q:在条件判断中,哪些算是真值,哪些算是假值? 在 Ruby 里 false、nil 表示假,其他所有对象都为真,包括 0、""、[]等 Q:有些方法名称里有?和!,是什么意思?比如 nil?和 strip!
方法名的最后可以有一个?或!,这只是一种命名习惯,让方法的涵义看起来更好懂 加?的方法,通常都是返回 true/false 的 像 nil?的功能是检测它的对象是否是 nil,obj.nil?感觉就是在问 obj 是 nil 吗? 又如 File.exist?("test.txt")感觉就是在问"test.txt"存在吗?
加!的方法,总有一个对应的不加!的方法,通常不加!的生成新对象,而加!的是对本对象进 行修改,如 String 类的 strip 和 strip!: str = " abc " new_str = str.strip # 不改动原 str 对象,而是新生成一个字符串,删去了前后空白符 str.strip! # 直接在原 str 对象上改动,删去 str 的前后空白符
?和!的使用并没有强制性的规定,你要定义一个返回 true/false 的方法,不加?也可以,或者 某个以?结尾的方法,不返回 true/false 也可,!也是。总之?和!就是一般字符,不具有限定 功能,只是增强可读性的 Q:我看到有 def []=(name, value)这样的写法,什么意思?难道定义了"[]="这个方法? Bingo![]=确实是一个方法。 Ruby 语言中很多(但不是全部)操作符实际上都是方法,比如像+ - * / % << == ** 等都是。 既然是方法,就可以在自己的类里定义。 str[2..4] = "xyz"其实相当于 str.[]=(2..4,"xyz"),也就是在 str 对象上调用[]=方法,传递两个参数 2..4 和"xyz" Q:我看到[1,2,3,4].from(2)的写法,但是在官方 API 里没有看到 from 这个方法啊? 说明 from 这个方法是第三方模块加到 Array 类里去的。 Ruby 的类是开放的,即使是核心的类,你也可以随意添加方法、undef 方法、增加别名等等 比如对于核心的 String
类: class String def to_file File.open(self) end end 然后我就可以"filename.txt".to_file 得到一个 file 对象了 Q:String#length 方法和 String#size 方法有没有区别?
没有区别,这两个方法完全一样,是同义词。 Ruby 的标准 API 里有不少方法的用法是完全相同的,作者的考虑可能是让不同来源的
程序 员都有