Project1

标题: self是什么啊... [打印本页]

作者: a554187203    时间: 2013-8-25 23:12
标题: self是什么啊...
本帖最后由 a554187203 于 2013-8-25 23:33 编辑

在脚本中看到了这样的句子,但是不知道究竟是什么,它有什么用
找到了特殊变量的说明,self:当前方法的执行对象本身。
这句话是什么意思啊
【苦思了一阵之后】
学过c的娃太苦了,对象总是不好理解,每一次以为理解了,但实际上对象还是很晦涩而深奥啊
RUBY 代码复制
  1. class Y
  2.   def x(y)
  3.     p y
  4.   end
  5. end
  6. class Yx < Y
  7.   def initialize(x)
  8.     self.x(x)
  9.   end
  10. end
  11. a = Yx.new(11)

看我这串代码,这个a就是当前方法的执行对象吗?
作者: 无脑之人    时间: 2013-8-26 08:40
在你那段脚本当中,任何Yx类的实例都是self
也就是说,调用方法的时候,调用者就是self
如果是在类里面定义的实例方法,那么这个类的实例就是self
如果是在定义类,那么这个类就是self,模块也是一样
有些时候情况会比较特殊= =不过可以暂且不管= =
作者: yagami    时间: 2013-8-27 00:53
class A
attr_accessor :id
attr_reader :id2

def set1(x) ##对id赋值
  @id=x
end

def set2(x)  ###效果等同set1
  self.id=x
end

def set3(x)###id是个局部变量 运行这个没效果
  id=x
end

def set4(x)
  self.id2=x   #self是对象本身 id2是attr_reader 所以调用这函数 会报错
end


end
作者: 巴尔德    时间: 2013-8-27 09:38
本帖最后由 巴尔德 于 2013-8-27 09:43 编辑

就是我的意思,在写代码的时候,把每个对象看成一个独立的个体,那么如果在类中的某个方法中需要引用当前的对象时,就用self来指代。
比如
  1. class Human
  2.   # 走一步
  3.   def step_1
  4.     # 比如调用某些指令能让这个对象前进一步
  5.     p "走了一步"
  6.   end
  7.   # 走两步
  8.   def step_2
  9.     # 走两步其实就是执行2次走一步
  10.     self.step_1
  11.     self.step_1
  12.   end
  13.   # 走三步
  14.   def step_5
  15.     self.step_2
  16.     self.step_2
  17.     # 当然这里的 self. 可以省略掉,默认也会去找当前类中的同名方法去执行
  18.     step_1
  19.   end
  20. end

  21. human = Human.new
  22. human.step_1  #  ->   "走了一步"

  23. human.step_2
  24. {
  25. 这里就等价于执行了
  26. human.step_1  #  ->   "走了一步"
  27. human.step_1  #  ->   "走了一步"
  28. }

  29. human.step_5
  30. {
  31. 这里就等价于执行了
  32. human.step_2
  33. human.step_2
  34. human.step_1
  35. 再拆开
  36. human.step_1  #  ->   "走了一步"
  37. human.step_1  #  ->   "走了一步"

  38. human.step_1  #  ->   "走了一步"
  39. human.step_1  #  ->   "走了一步"

  40. human.step_1  #  ->   "走了一步"
复制代码

作者: 风若·飘絮    时间: 2013-8-28 22:11
相当于C的$this吧
作者: orzfly    时间: 2013-8-29 05:56
如果楼主能看懂英文的话:http://www.jimmycuadra.com/posts/self-in-ruby,最好看一看这篇文章。

The keyword self in Ruby gives you access to the current object – the object that is receiving the current message. To explain: a method call in Ruby is actually the sending of a message to a receiver. When you write obj.meth, you're sending the meth message to the object obj. obj will respond to meth if there is a method body defined for it. And inside that method body, self refers to obj.

简单翻译下:Ruby 中关键字 self 让你访问当前对象——正在接受当前消息的对象。解释一下,Ruby 中调用一个方法实际上是给接收者发送一个消息的过程。当你写 obj.meth 的时候,你在把消息 meth 发送给对象 obj。如果为 meth 定义了一个方法体的话,obj 将会对 meth 作出反应。这时,在方法体中,self 指代的便是 obj。

----------------
但是,这只是最简单的 self 的解释。Ruby 中的上下文其实没那么简单。有些 block 会改变 self 有些不会。
比如 ***; class XXX; ...; end; *** 中 ... 位置的 self 含义和 *** 位置的就不一样。
而 ***; XXX = Class.new do ... end; *** 中 ... 位置的 self 含义和 *** 位置的一样。

@晴兰 这方面知识比我扎实。
作者: 晴兰    时间: 2013-8-29 07:03
提示: 作者被禁止或删除 内容自动屏蔽
作者: a554187203    时间: 2013-8-29 11:17
晴兰 发表于 2013-8-29 07:03
0. self就是执行方法的对象
的那个对象.
   class A

代码很简单明了,后面六句话就晕了{:2_270:}
不过我想知道的东西知道了,谢谢层主
@︶ㄣ牛排ぶ  结贴~
作者: chd114    时间: 2013-8-29 11:20
self是一种对象体现= =你可以用它显示图片、文字、文本框···




欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1