Ruby对象原生行为
Varsion

只要创建对象存在,他就能相应一组消息,每个对象在被创建时都语句确切的能力

irb解释器中 p Object.new.methods.sort 可以查看其原始方法

object_id表示唯一对象

Ruby中每一个对象都有一个和他唯一关联的ID编号,可以通过请求object_id获得该对象的ID 。

1
2
3
4
5
6
7
8
9
10
class Tist
def initialize(id)
@id = id
end

def getID
return @id
end

end
1
2
3
4
5
6
load "class.rb"
ts1 = Tist.new("1")
ts2 = Tist.new("2")

puts ts1.object_id
puts ts2.object_id

上述尝试可以看出,同为一个类的对象object_id并不相等

在尝试确认两个对象是否相等时,可以采取判断objectt_id的方法

1
2
3
4
5
6
7
load "class.rb"
ts1 = Tist.new("1")
ts2 = Tist.new("2")

ts = ts1
puts ts1.object_id
puts ts.object_id

ID编号和对象的相等性

Ruby中给对象指定一个ID编号能够使对象有唯一的身份标识

respond_to?方法查询对象的能力

Ruby对象响应消息,在程序运行期间的不同时间点,依赖于对象和为对象定义的各种方法。

用户可以提前判断(在要求对象执行任务前)对想是否知道如何处理发送给他的消息,respond_to?对于所有对象都适用,通常和if语句联合使用

1
2
3
4
5
6
obj = Object.new
if obj.respond_to?("talk")
obj.talk
else
puts "error"
end

respond_to?使自省(_introspection_)或者反射(_reflection_)的一个例子

send方法发送信息给对象

send方法类似于.方法调用对象函数

1
2
3
4
5
6
obj = Object.new
if obj.respond_to?("talk")
obj.send("talk")
else
puts "error"
end

使用__send__或者public_send代替send

  • __send__是为了避免send方法和对象内建方法冲突
  • send__send__可以调用对象的私有方法,public_send方法却不能

  • Post title:Ruby对象原生行为
  • Post author:Varsion
  • Create time:2020-07-23 12:31:16
  • Post link:https://blog.varsion.cn/post/a4983831.html
  • Copyright Notice:All articles in this blog are licensed under BY-NC-SA unless stating additionally.
Comments