博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
第九章 运算符
阅读量:7206 次
发布时间:2019-06-29

本文共 1998 字,大约阅读时间需要 6 分钟。

  1. Ruby 的运算符大多都是作为实例方法提供给我们使用的,因此我们可以很方便地定义或者重定义运算符,改变其原有的含义。但是,表 9.3 中列举的运算 符是不允许修改的。

二元运算符

class Point

  attr_reader :x, :y
  def
initialize(x=0, y=0)
    @x, @y = x, y
  end
  def
inspect # 用于显示
    "(#{
x}, #{
y})"
  end
  #左侧是方法调用者定义时可以不写,右侧other就是方法的参数
  def +(other) # x、y 分别进行加法运算
    self.class.new(x + other.x, y + other.y)
  end
  def
-(other) # x、y 分别进行减法运算
    #如下改成Point.new(x - other.x, y - other.y)也行
    self.class.new(x - other.x, y - other.y)
  end
end
point0 = Point.new(3, 6)
point1 = Point.new(1, 8)
p point0 #=> (3, 6)
p point1 #=> (1, 8)
#point0就是调用者(也叫方法接收者),+是方法,point1是方法的参数
p point0 + point1 #=> (4, 14)
p point0 - point1 #=> (2, -2)

(2)可定义的一元运算符有 +、-、~、! 4 个。它们分别以 +@、-@、~@、!@ 为方法名进行方法的定义。下面就让我们试试在 Point 类中定义这几个运算符:

class Point

  attr_reader :x, :y
  def
initialize(x=0, y=0)
    @x, @y = x, y
  end
  def
inspect # 用于显示
    "(#{
x}, #{
y})"
  end
  def
+@
    dup # 返回自己的副本
  end
  def
-@
    self.class.new(-x, -y) # 颠倒x、y 各自的正负
  end
  def
~@
    self.class.new(-y, x) # 使坐标翻转90 度
  end
end
point = Point.new(3, 6)
p +point #=> (3, 6)
p -point #=> (-3, -6)
p ~point #=> (-6, 3)

(3)数组、散列中的 obj[i] 以及 obj[i]=x 这样的方法,称为下标方法。定义下标方法时的方法名分别为 [] 和 []=。在代码清单 9.3 中,我们将会定义 Point 类实例 pt 的下标方法,实现以 v[0] 的形式访问 pt.x,以 v[1] 的形式访问 pt.y。

class Point

  attr_accessor :x, :y
  def
initialize(x=0, y=0)
    @x, @y = x, y
  end
  def
inspect # 用于显示
    "(#{
x}, #{
y})"
  end
  def
[](index) #这个定义看着别扭,实际调用时就是 接收者[index]
    case index
    when 0
      x
    when 1
      y
    else
      raise ArgumentError, "out of range `#{
index}'"
    end
  end
  def
[]=(index, val) #这个定义看着别扭,实际调用时就是 接收者[index]=val
    case index
    when 0
      self.x = val
    when 1
      self.y = val
    else

       raise ArgumentError, "out of range `#{

index}'"
    end
  end
end
point = Point.new(3, 6)
p point[0] #=> 3
p point[1] = 2 #=> 2 必须把上面y访问级别改为attr_accessor,不然因为attr_reader只读,会报错没有y=这个写的方法
p point[1] #=> 2
p point[2] #=> 错误(ArgumentError)

 

转载于:https://www.cnblogs.com/blueColdFire/p/5179789.html

你可能感兴趣的文章
使用分析服务多维模式建立简单的分析模型
查看>>
Oracle Real Application Testing diagram
查看>>
IoC容器Autofac(2) - 一个简单示例(附demo源码)
查看>>
桥接模式 - 设计模式学习
查看>>
Google Maps Android API v2 (2)- 地图对象
查看>>
MySQL 5.5 手册下载
查看>>
hdu 1300(dp)
查看>>
POJ 1159 - Palindrome 优化空间LCS
查看>>
CH BR8(小学生放假了-clock()/CLOCKS_PER_SEC-斜率优化常错集锦)
查看>>
N!末尾有多少个零
查看>>
【优先队列】HDU 1873——看病找医生
查看>>
SQL 时间处理
查看>>
HF Reader
查看>>
eclipse项目中关于导入的项目里提示HttpServletRequest 不能引用的解决办法
查看>>
Css 常用属性
查看>>
GRIDVIEW多行多列合并单元格(合并列)
查看>>
sharepoint2010问卷调查(3)-实现问卷的开始和结束时间(采用自定义字段类型)...
查看>>
java final
查看>>
【吐槽】VS2012的安装项目只能用InstallShield Limited Edition
查看>>
win7重装系统时,使用PE工具箱进入系统看到的“C盘变成0.2G,D盘变成48G左右”这是什么回事?...
查看>>