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

Project1

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

[推荐问答] 有关'==','<=>','==='方法的问题

[复制链接]

Lv1.梦旅人

梦石
0
星屑
180
在线时间
810 小时
注册时间
2013-8-23
帖子
804

开拓者

跳转到指定楼层
1
发表于 2015-9-26 18:17:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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

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

x
本帖最后由 RyanBern 于 2015-9-27 00:28 编辑

好久没提问了,来问个问题。。。


p 5 == "5"     这个输出nil
p 5 === "5"    这个输出false

对于==    若<=>返回nil,==返回nil
<=>为什么会返回nil?
<=>是在哪定义的?
<=>是如何进行比较的?(5和“5”完全是不同类的对象,怎么比?)
===该方法通常用在 case 的比较句中。默认情况下,它的运作等同于 Object#==
Range类中===用在 case 句的比较中,若 obj 与 self 之间存在 Object#kind_of? 关系时就为真。
case里有整数和范围的比较,可以正常运行   (整数的类和范围的类没什么所属关系吧,为什么case里可以正常比较?)
p 2..6 === 4      这个会报错?
p 2..6 == 4   也同样报错,==定义在顶层Object里,难道不是对一切对象都能用的吗,会有参数错误?

点评

帖子标题请尽量描述清楚问题,写成 p 5 == "5" 是不好的  发表于 2015-9-27 00:29

评分

参与人数 1星屑 +135 收起 理由
RyanBern + 135 设置为推荐问答+手动认可奖励

查看全部评分

遗失的签名。。。

Lv3.寻梦者 (版主)

…あたしは天使なんかじゃないわ

梦石
0
星屑
2208
在线时间
4033 小时
注册时间
2010-10-4
帖子
10779

开拓者贵宾

2
发表于 2015-9-26 21:14:36 | 只看该作者
本帖最后由 taroxd 于 2015-9-26 21:35 编辑

<=>为什么会返回nil?
<=>是在哪定义的?
  定义在 Object 里面。若左右两边为同一对象,返回 0,否则返回 nil。

<=>是如何进行比较的?(5和“5”完全是不同类的对象,怎么比?)
  5和“5”完全是不同类的对象,没法比。

===该方法通常用在 case 的比较句中。默认情况下,它的运作等同于 Object#==
Range类中===用在 case 句的比较中,若 obj 与 self 之间存在 Object#kind_of? 关系时就为真。
case里有整数和范围的比较,可以正常运行   (整数的类和范围的类没什么所属关系吧,为什么case里可以正常比较?)
  Range 类定义了 === 方法,当参数在 Range 区间内的时候返回 true。case 中就是用 === 来判断是否符合条件的。
  注意 === 不是用来比较的。这个方法的行为可以自定义:比如判断一个对象是否属于一个类,一个数是否在范围里,正则表达式是否能匹配字符串,甚至直接定义为执行一个 Proc

p 2..6 === 4      这个会报错?
p 2..6 == 4   也同样报错,==定义在顶层Object里,难道不是对一切对象都能用的吗,会有参数错误?
  按照优先级,这段代码等价于 p(2..(6 === 4)) 和 p(2..(6 == 4))
  请打上括号: p (2..6) === 4

RUBY 代码复制
  1. class Game_Actor
  2.  
  3.   # 仅为示例,请勿模仿!
  4.   def <=> other
  5.     return unless other.respond_to? :name
  6.     name <=> other.name
  7.   end
  8. end
  9.  
  10. $game_party.actors.sort  # 角色都按照名字排序了
  11.  
  12.  
  13. case actor_id
  14. when Float
  15.   "ID是小数"
  16. when 1, 2
  17.   "主角"
  18. when 3..8
  19.   "酱油"
  20. when lambda { |id| id.even? }
  21.   "ID是偶数"
  22. else
  23.   ""
  24. end

评分

参与人数 1梦石 +1 收起 理由
RyanBern + 1 认可答案

查看全部评分

回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
180
在线时间
810 小时
注册时间
2013-8-23
帖子
804

开拓者

3
 楼主| 发表于 2015-9-26 22:44:16 | 只看该作者
本帖最后由 冰水金刚 于 2015-9-26 22:48 编辑
taroxd 发表于 2015-9-26 21:14
为什么会返回nil?
是在哪定义的?
  定义在 Object 里面。若左右两边为同一对象,返回 0,否则返回 nil。


return unless other.respond_to? :name   这句看不懂,actor里有respond_to?方法?前面加unless做什么, :name是什么

lambda { |id| id.even? }                             这句也看不懂,lambda是什么,even?是什么方法
另外Object 里面没找到有<=>啊。。。。。。
遗失的签名。。。
回复 支持 反对

使用道具 举报

Lv3.寻梦者 (版主)

…あたしは天使なんかじゃないわ

梦石
0
星屑
2208
在线时间
4033 小时
注册时间
2010-10-4
帖子
10779

开拓者贵宾

4
发表于 2015-9-27 07:31:06 | 只看该作者
冰水金刚 发表于 2015-9-26 22:44
return unless other.respond_to? :name   这句看不懂,actor里有respond_to?方法?前面加unless做什么, ...

Object.method_defined? :<=>  # => true  说明 Object 定义了 <=> 方法。

return unless other.respond_to? :name 如果 other 没有 name 方法的话,返回 nil。判断类型用的。
不考虑不同类型的话可以无视。

lambda { |id| id.even? }  看不懂无视好了。我只是提供 case 各种乱七八糟的用法。


另外,查找方法的时候不要用 F1(非常不全),请去找 Ruby 文档。
回复 支持 反对

使用道具 举报

Lv4.逐梦者

梦石
0
星屑
9732
在线时间
3227 小时
注册时间
2011-3-24
帖子
739

开拓者

5
发表于 2015-9-27 16:43:12 | 只看该作者
<=>也用于数组的sort方法
具体应用比如:
你有一个数组a里都是Game_Actor对象,你想把它们按id排序,于是就需要这样:
  1. class Game_Actor
  2.   def <=>(val)
  3.     return id <=> val.id
  4.   end
  5. end
复制代码
这样的话就可以直接a.sort!了
>>→Lanza Games 2020←<<
Lanza Schneider
浪子心,孤星梦永远流浪……
~不会放弃,我的精力永远充沛~
>>>>>Lanza Adventure<<<<<
>>>>>Lanza的新年派对!<<<<<
>>>>>Lanza的口袋心脏病!<<<<<
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-11-22 11:57

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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