设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 1515|回复: 9
打印 上一主题 下一主题

[已经解决] self是什么啊...

[复制链接]

Lv1.梦旅人

超级囧神 无尽的灌水

梦石
0
星屑
144
在线时间
784 小时
注册时间
2010-6-27
帖子
2065
跳转到指定楼层
1
发表于 2013-8-25 23:12:22 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有帐号?注册会员

x
本帖最后由 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就是当前方法的执行对象吗?

Lv1.梦旅人

梦石
0
星屑
117
在线时间
552 小时
注册时间
2012-8-18
帖子
1429
2
发表于 2013-8-26 08:40:53 | 只看该作者
在你那段脚本当中,任何Yx类的实例都是self
也就是说,调用方法的时候,调用者就是self
如果是在类里面定义的实例方法,那么这个类的实例就是self
如果是在定义类,那么这个类就是self,模块也是一样
有些时候情况会比较特殊= =不过可以暂且不管= =
我要填坑!我要背单词!我要学日语!我要每天锻炼!
好吧呵呵= =
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
3582
在线时间
3065 小时
注册时间
2011-11-17
帖子
980
3
发表于 2013-8-27 00:53:11 | 只看该作者
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
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
32 小时
注册时间
2013-6-28
帖子
39
4
发表于 2013-8-27 09:38:46 | 只看该作者
本帖最后由 巴尔德 于 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  #  ->   "走了一步"
复制代码
回复 支持 1 反对 0

使用道具 举报

Lv1.梦旅人

幻想天神

梦石
0
星屑
55
在线时间
166 小时
注册时间
2012-3-24
帖子
404
5
发表于 2013-8-28 22:11:36 | 只看该作者
相当于C的$this吧

点评

C++ 才有 this 吧…… (to @晴兰: 你的黑科技就不要跟我说了)  发表于 2013-8-29 05:48
回复 支持 反对

使用道具 举报

Lv6.析梦学徒

Fuzzy Ginkgo
Taciturn Knight

梦石
0
星屑
60819
在线时间
1934 小时
注册时间
2010-6-26
帖子
1605

烫烫烫开拓者

6
发表于 2013-8-29 05:56:03 | 只看该作者
如果楼主能看懂英文的话: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-31 17:46

评分

参与人数 1星屑 +90 收起 理由
︶ㄣ牛排ぶ + 90 认可答案

查看全部评分

我的言论只代表我个人的观点,不代表雇主及/或任何第三方的立场。
Opinions expressed are solely my own and do not express the views or opinions of my employer and/or any third parties.
捐赠 | GitHub
回复 支持 反对

使用道具 举报

头像被屏蔽

Lv2.观梦者 (禁止发言)

梦石
0
星屑
653
在线时间
3774 小时
注册时间
2011-2-26
帖子
1839

开拓者

7
发表于 2013-8-29 07:03:01 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
签名被屏蔽
回复 支持 反对

使用道具 举报

Lv1.梦旅人

超级囧神 无尽的灌水

梦石
0
星屑
144
在线时间
784 小时
注册时间
2010-6-27
帖子
2065
8
 楼主| 发表于 2013-8-29 11:17:25 | 只看该作者
晴兰 发表于 2013-8-29 07:03
0. self就是执行方法的对象
的那个对象.
   class A

代码很简单明了,后面六句话就晕了{:2_270:}
不过我想知道的东西知道了,谢谢层主
@︶ㄣ牛排ぶ  结贴~
回复 支持 反对

使用道具 举报

Lv4.逐梦者

梦石
0
星屑
9280
在线时间
2504 小时
注册时间
2011-5-20
帖子
15389

开拓者

9
发表于 2013-8-29 11:20:48 | 只看该作者
self是一种对象体现= =你可以用它显示图片、文字、文本框···
[img]http://service.t.sina.com.cn/widget/qmd/5339802982/c02e16bd/7.png
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-11-17 14:18

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表