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

Project1

 找回密码
 注册会员
搜索
123
返回列表 发新帖
楼主: 喵呜喵5
打印 上一主题 下一主题

[胡扯] 【用代码说话】#1.实例对象

[复制链接]

Lv4.逐梦者

梦石
2
星屑
5545
在线时间
2566 小时
注册时间
2012-2-9
帖子
990

开拓者

21
发表于 2016-7-17 19:08:30 | 只看该作者
本帖最后由 garfeng 于 2016-7-17 22:34 编辑
RyanBern 发表于 2016-7-17 18:06
永远不要用其他语言来类比Ruby,尤其是C语言。这也是我初学的时候犯的错误之一。

首先吐槽为什么输出 ...


谢谢指出,在你提到%p之前,我从未意识到用%p来打印地址。%p是定长的16进制吧。

我没有想用C来类比ruby,

我只是想用一个直观的办法,来解释我理解范围内的:
为什么一个类的两个实例不是同一个东西
这个问题,在JavaScript,C++,Go……等其他语言里的原因都是地址不一样。
所以我妄断在ruby里,也是这个原因,
谢谢指出问题,因为ruby的某个比较的方法,还会比较哈希值吗?
RUBY 代码复制
  1. a=A.new
  2. b=a.dup

这种情况,比较的时候,不是比较值本身而是地址吧。
ruby的比较机制确实跟其他语言大不相同呢。
谢谢指教。
你叫我把%d修改成%p吗?【已经修改,谢谢提醒】
还是修改不应该用c类比ruby这一段?【不是类比语言,而是类比数据在内存里的存储方式,所以先不改了……】

点评

抱歉已修改  发表于 2016-7-17 22:35
cup?  发表于 2016-7-17 22:33
回复 支持 反对

使用道具 举报

Lv4.逐梦者 (版主)

梦石
0
星屑
9497
在线时间
5073 小时
注册时间
2013-6-21
帖子
3580

开拓者贵宾剧作品鉴家

22
发表于 2016-7-17 20:24:01 | 只看该作者
本帖最后由 RyanBern 于 2016-7-17 22:06 编辑
garfeng 发表于 2016-7-17 19:08
谢谢指出,在你提到%p之前,我从未意识到用%p来打印地址。%p是定长的16进制吧。

我没有想用C来类比ruby ...


其实喵呜在写这一段的时候不应该引入'=='这个符号的,因为这个给初学者造成了非常大的困扰。真正判断是否相等的方法应该是Object#equal?,这个方法才属于真正的所谓“判断地址”。这是因为'=='在某些内置类里面已经被覆盖,因此执行'=='判断的时候只是判断内容相等与否。
RUBY 代码复制
  1. arr_a = [0, 1]
  2. arr_b = arr_a.dup
  3. p (arr_a == arr_b) #=> true
  4. str_a = "Hello World"
  5. str_b = str_a.dup
  6. p (str_a == str_b) #=> true

喵呜举例的时候,特地用了自己定义的类A,在默认情况下,'=='的含义等同于'equal?',因此这样才不会出问题。因此我建议,不论是你还是楼主喵呜,都应该先引入'equal?'来解释这个问题为好。

嗯,不去类比或者类推是最好的,因为如果这样理解Ruby会经常出错。

另外%d表示32位整数,但是指针的话有两种,有32位指针和64位指针的区别(视系统而定),因此使用%d打印是不合理的,而%p才是专门用来打印指针的格式转换符。

点评

(0..2).eql?(Range.new(0,2))  发表于 2016-7-19 16:47
equal? 才是比对象引用,eql? 的意义是在取 hash 的意义下相等  发表于 2016-7-17 21:05
想了想,将代码改成了这样 p (a.object_id == aa.object_id) == === eql? equal? 这几个都够单独写一篇了  发表于 2016-7-17 21:04
然而麻烦的地方在于从 == 这里开始的话就没完没了了……  发表于 2016-7-17 20:50

评分

参与人数 1星屑 +100 收起 理由
garfeng + 100 谢谢~

查看全部评分

回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
1287
在线时间
671 小时
注册时间
2009-11-11
帖子
2790
23
发表于 2016-7-17 21:07:40 | 只看该作者
a 当然等于 a的副本了 :arr_b = arr_a.dup
a = a.dup
p (arr_a == arr_b) #=> true 还有 P 出来,我也是醉了

点评

OK  发表于 2016-7-18 20:42
是啊,那你别dup啊  发表于 2016-7-18 20:13
这个地球人都知道的吧,我晕,你XX的是她的copy啦  发表于 2016-7-18 19:32
对副本的操作不会影响到本体,如果相等的话,对副本操作,本体也会跟着变  发表于 2016-7-17 22:19
也许地址不一样吧,额,我是没太计较这些东西,额额, 额  发表于 2016-7-17 22:14

嘿。嘿。嘿
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
1934
在线时间
403 小时
注册时间
2015-8-30
帖子
395
24
发表于 2016-7-18 14:31:14 | 只看该作者
  1. class A; end
  2. p(A.new)
  3. a = A.new; p(a)
  4. b = A.new; p(b)
  5. p(a == A.new)
  6. p(b == A.new)
  7. p(a == b)
  8. p(A.new == A.new)
  9. # =>
  10. #    #<A:0x8c****>
  11. #    #<A:0x8c****>
  12. #    #<A:0x8c****>
  13. #    false
  14. #    false
  15. #    false
  16. #    false
复制代码
没错,这非常让人疑惑。@英顺的马甲 @garfeng

点评

p a.is_a(A), a.object_id  发表于 2016-7-18 18:39
看19楼中间一段,a=A.new,b=A.new那里。  发表于 2016-7-18 15:18
尤其第八行和第十六行  发表于 2016-7-18 14:32
小仙女一枚~
回复 支持 反对

使用道具 举报

Lv5.捕梦者 (暗夜天使)

只有笨蛋才会看到

梦石
1
星屑
21110
在线时间
9347 小时
注册时间
2012-6-19
帖子
7107

开拓者短篇九导演组冠军

25
 楼主| 发表于 2016-7-18 15:44:41 | 只看该作者
有丘直方 发表于 2016-7-18 14:31
没错,这非常让人疑惑。@英顺的马甲 @garfeng

并没有什么好疑惑的,很简单,因为这里的 == 等于 true 代表的是:两个对象【完全一样】

什么是完全一样呢
假设,你进入一场战斗,敌人是两个史莱姆,你打了左边那个史莱姆,右边那个史莱姆一脸没事的样子看着你,那这两个史莱姆就是不一样的
你打了左边那个史莱姆,右边那个史莱姆的血跟着左边史莱姆一起扣,那这两个史莱姆是完全一样的

面向对象想要实现的就是,不管出来一只史莱姆还是一百只史莱姆,只要他们是不一样的对象,那么打了左边史莱姆,右边的史莱姆就不应该跟着一起扣血

点评

A.new <- 都说了是new啊,就是新的实例,所以两个新的实例是不同的实例有毛问题啊?  发表于 2016-7-18 18:42
你这段代码和 a = A.new; b = A.new; a != b 没啥区别  发表于 2016-7-18 16:46
有啥好解释的,一次 A.new 生成一个实例,你的代码里两次 A.new 生成两个实例呗  发表于 2016-7-18 16:45
那你怎么解释A.new!=A.new  发表于 2016-7-18 16:42

评分

参与人数 1星屑 +5 收起 理由
有丘直方 + 5

查看全部评分

回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
76
在线时间
1379 小时
注册时间
2012-7-5
帖子
1698

开拓者

26
发表于 2016-7-18 21:32:46 | 只看该作者
其实

ruby有很多应该小心的地方没错

但是一开始就讲这些对于新人是否太深了

喵喵喵觉得应该先快速地体现一下ruby"容易写"的特点(即, 书写时比较符合直觉, 而且直接读起来应该是很流畅的)
# 这也是ruby被各种语法糖包裹的一个目的

并且用ruby来解释面向对象将会十分容易(比如, 类的基本形式就是用class包住一些methods和instance_variables【雾)

快速地介绍完变量 方法 类 模块的简单写法和笑果之后, 可以紧接着画个作用域的盒模型【大雾

到这里就可以说入门结束了吧, 不用考虑一些枝节(这些东西应该直接丢doc, 而且理解了上一行的内容之后大都是可以自己看懂的)。

因为喵喵喵差不多也就是个入门的层次所以话就说到这了【逃

评分

参与人数 1星屑 +10 收起 理由
有丘直方 + 10 说得很对

查看全部评分


  -fk: -azogi:
回复 支持 反对

使用道具 举报

Lv4.逐梦者 (版主)

漾夕☽星化残月☾

梦石
0
星屑
8492
在线时间
3848 小时
注册时间
2015-5-12
帖子
2076

剧作品鉴家

27
发表于 2016-7-31 13:11:10 | 只看该作者
本帖最后由 御曹司 于 2016-7-31 13:13 编辑

好棒的帖子~~
居然今天才发现的说
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-6-5 11:54

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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