We walk and learn
Ruby version: 2.3.0
使用 new
方法创建实例。
类的继承关系。
BasicObject
| - Object
| - Array
| - String
| - Hash
| - Regexp
| - IO
| - File
| - Dir
| - Numeric
| - Integer
| - Fixnum
| - Bignum
| - Float
| - Complex
| - Rational
| - Exception
| - Time
根据对象查找所属的类时使用 instance_of?
方法。
根据类的继承关系反向追查对象是否属于某个类时使用 is_a?
方法。
使用 class
定义类,类名首字母必须大写。
使用 new
方法生成对象时,initialize
方法被调用。
定义 | 意义 |
---|---|
attr_reader | 只读 |
attr_writer | 只写 |
attr_accessor | 读写 |
实例方法中,可以用 self
来引用方法的接收者。
调用方法时,如果省略了接收者,Ruby
就会默认把 self
作为该方法的接收者。
方法的接收者就是类本身的方法称为类方法。
类方法可以通过以下4中方式定义:
class << Hello
def hello(name)
puts "#{name} said hello"
end
end
class Hello
class << self
def hello(name)
puts "#{name} said hello"
end
end
end
def Hello.hello(name)
puts "#{name} said hello"
end
class Hello
def self.hello(name)
puts "#{name} said hello"
end
end
类中可以定义常量,在类的外部可以使用 ::
来实现外部访问。
以 @@
开头的变量称为类变量。从类外部访问类变量需要使用存取器,但 attr_accessor
等存取器不能使用,只能直接定义类变量的存取器。
方法的访问级别有 public
、private
、protected
三种。
class AccTest
def foo
print "foo"
end
private :foo # 将foo方法设定为private
public # 不指定参数时,以下方法都被定义为public
def bar
print "bar"
end
没有指定访问级别的方法默认为public,但initialize方法是个例外,它通常会被定义为private。
class Child < Father
def foo
end
end
Object
子类。BasicObject
类。instance_methods
方法后,就会以符号形式返回该类的实例方法列表。alias f_new f_ori # 直接使用方法名
alias :f_new :f_ori # 使用符号名
undef f_name # 直接使用方法名
undef :f_name # 使用符号名
利用单例类定义,可以给对象添加方法(单例方法)。
obj.func(p1, p2, ..., pn)
在面向对象的世界,调用方法可以理解为“向对象发送消息”。上面的代码中接收者为 obj
,消息为 func
,括号中的为消息的参数。在调用方法时 ()
可以省略。
obj.func(p1, p2, ..., pn) do |v1, v2, ... |
block
end
obj.func(p1, p2, ..., pn) { |v1, v2, ... |
block
}
可以使用 do ~ end
或 {}
将块传递给方法。使用 do ~ end
时,可以省略参数列表的 ()
。使用 {}
时,只有参数列表为空才可省略 ()
。
四则运算等二元运算符,负号等一元运算符,指定数组、散列的元素下标的 []
等,实际上都是方法。
Array.new
,Time.now
等。print
,sleep
等。def func_name(p1, p2, ..., pn)
func_content
end
def f(a, b=1, c)
return a + b + c
end
f(10, 100) # => 111
f(10, 2, 100) # => 112
def f(n)
if n < 0 then
return
elsif n == 0 then
return 0
n
end
f(-1) # => nil
f(0) # => 0
f(1) # => 1
return
语句指定方法的返回值。return
时,方法最后一个表达式的结果就会成为方法的返回值。return
的参数,方法将返回 nil
。yield
定义的地方执行。yield
部分有参数,程序就会将其当作块变量传递到块中。yield
的返回值在块的外部继续使用。def f(a, *b)
[a, b]
end
f(1) # => [1, []]
f(1, 2, 3) # => [1, [2, 3]]
*args
形式来定义个数不确定的参数。def f(a, *b, c)
。def f(a: 1, b: 2)
a * b
end
name: value
形式指定默认参数。value
,但调用时此参数不可省略。def f(a: 0, **b)
[a, b]
end
f(a: 1) # => [1, {}]
f(a: 1, x: 10) # => [1, {:x=>10}]
**args
的形式,接收未定义的关键字参数,这些参数将以散列对象的形式保存。def f(a:1, b:2)
a * b
end
f({a: 10})
f(a: 10)
f(x: 10) # => ArgumentError
{}
。def foo(a, b, c)
a * b * c
end
foo(1, *[2, 3])
Ruby社区使用两个空白表示一个缩进。