Effective Ruby

杰瑞发布于2025-03-04

48 Specific ways to write better ruby

1.false:
0 is true; true.class > TrueClass; false.class > FalseClass; 只有 false 和 nil 为false;如果你要区分false和nil,可以使用nil? 或 == 操作符,并将false作为左操作对象,以防止 == 这个方法被覆盖。
2.nil:
所有对象的value都可能为nil;都来之 BasicObject. 一个类的对象被另外一个类的对象替换(多态)鸭子类型duck typing. 接口高于类型。 is_a? or respond_to? NomethodError; 任何对象都可能是nil,做好防范。可以将nil.to_s to_i; Array#compact 可以去除nil元素;
3.perl =~ $: $_:
message =~/^ERROR:\s+(.+)$/; $1 ; 这个$1不是全局变量,而是表示匹配的第一组的内容;是特殊全局变量。这里会费解,改成 m= message.match(/^ERROR:\s+(.+)$/) ; m[1]; String#match 返回MatchData; $: = $LOAD_PATH 别名; Kernel#readline; Kernel#print with $_ ;
4.冻结freeze:
networks=["192.168.1"]; networks.delete_if do {|net| !ping(net + ".1"}; freeze冻结数组;数组冻结,无法增删,但元素依然可变; [...].map!(&:freeze).freeze; Defaults.freeze; 三个级别的冻结: 模块,对象,对象里面的元素;
5.ambiguous 语义不清的问题:
'808'.split(/0/); dirs = ['usr','local']; File.join(*dirs); dirs.map(&:length);$VERBOSE=true or -w or RUBYOPT=-w 会显示提示;
6.Object:
对象是变量的容器,称为实例变量,并代表对象的状态,特殊内部变量-连接唯一的类;类是方法和常量的容器,是它的所有实例的方法。 超类就是类的父类,有特殊变量跟踪超类。模块和类的区别是模块没有new方法;单例类。。。再定义类的方法self..会生成一个匿名的类在实例的链条上.
BasicObject> Kernel> Object >SomeModuleInPerson > Person > Customer.
Customer.singleton_class.instance_methods(false) 查看单例类。
Customer.superclass; Customer.ancestors; Customer.included_modules;
7.用super调父类,要注意():
super 会把宿主方法的所有参数全部传递过去.enclosing method;
8. initialize and initialize_copy:
def initialize(name,grade) {super(name; @grade = grade}; dup和clone 也可以构建新对象的副本,可以定义initialize_copy方法来初始化副本。