查看: 2718|回复: 2

[已经解决] 能否新建一个数据类型?

[复制链接]
头像被屏蔽
梦石
0
星屑
88
在线时间
631 小时
注册时间
2014-8-4
回帖
3243
发表于 2015-9-12 14:30:22 | 显示全部楼层 |阅读模式
提示: 作者被禁止或删除 内容自动屏蔽
签名被屏蔽

梦石
1
星屑
23236
在线时间
9564 小时
注册时间
2012-6-19
回帖
7018

开拓者短篇九导演组冠军

发表于 2015-9-12 15:43:46 | 显示全部楼层
本帖最后由 喵呜喵5 于 2015-9-12 15:48 编辑

[pre lang="ruby"]class Fraction
  attr_accessor :numerator, :denominator  
  def initialize(array)
    @numerator = array[0].to_i   
    @denominator = array[1].to_i
    raise "分母不为0" if @denominator == 0
    reduction
  end
  # 极其简陋的约分(破坏性)
  def reduction
    @denominator = 1 if @numerator == 0
    [@denominator, @numerator, 2, 3, 5, 7].each do |i|
      next if i == 1 || i == -1 || i == 0
      while @numerator % i == 0 && @denominator % i == 0        
        @denominator /= i; @numerator /= i
      end
    end
    self
  end
  # 取负数(破坏性)
  def -@; self.numerator = -self.numerator; self; end
  # 取倒数(破坏性)
  def reciprocal
    self.numerator ,self.denominator = self.denominator, self.numerator
    self
  end  
  # 将整数转换为分数
  def change_to_fraction(number)
    return Fraction.new([number,1]) if number.class != Fraction
    number
  end
  # 加
  def +(number)
    r = self.clone
    n = change_to_fraction(number)
    r.numerator *= n.denominator
    r.numerator += n.numerator * r.denominator
    r.denominator *= n.denominator   
    r.reduction   
  end
  # 乘
  def *(number)
    n = change_to_fraction(number)
    r = self.clone
    r.denominator *= n.denominator
    r.numerator *= n.numerator
    r.reduction
  end
  # 减
  def -(number); self.+(-number); end
  # 除
  def /(number); self.*(change_to_fraction(number).reciprocal); end
  
  # 数据类型的转换
  def to_f; @numerator.to_f / @denominator; end
  def to_i; @numerator / @denominator; end
  def to_s
    return @numerator.to_s if @denominator == 1
    "#{@numerator}/#{@denominator}"
  end
end
  
  
a = Fraction.new([1,4])
b = Fraction.new([2,3])

p a + b
p a - 1
p b * 3
p b / a
[/pre]

点评

所以这段代码里确实没用上嘛  发表于 2015-9-12 18:56
1 + Fraction.new([1, 4])  发表于 2015-9-12 17:41
这段代码里又用不上……  发表于 2015-9-12 16:46
不定义 coerce 么  发表于 2015-9-12 16:40
牛!  发表于 2015-9-12 15:54

评分

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

查看全部评分

回复

使用道具 举报

头像被屏蔽
梦石
0
星屑
172
在线时间
935 小时
注册时间
2010-11-13
回帖
897
发表于 2020-6-6 21:56:59 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
签名被屏蔽
回复

使用道具 举报

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

本版积分规则

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖返回顶部