Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 使用自定义类创建离散范围_Ruby - Fatal编程技术网

Ruby 使用自定义类创建离散范围

Ruby 使用自定义类创建离散范围,ruby,Ruby,由于范围是两个端点之间的值,我们需要比较两个端点之间的值,因此我们使用比较运算符,它比较其两个操作数,并根据它们的相对顺序计算为–1、0或1 第二,如果我们想要迭代,那么我们必须有一个离散的范围成员集,而不是一个连续的集合。我们使用succ创建离散范围。整数肯定是离散的 所以我构建了一个名为Apple的类。如您所见,我定义了比较运算符方法和succ方法,因为我需要一个离散范围: class Apple attr_accessor :val def initialize(val) @va

由于范围是两个端点之间的值,我们需要比较两个端点之间的值,因此我们使用比较运算符,它比较其两个操作数,并根据它们的相对顺序计算为–1、0或1

第二,如果我们想要迭代,那么我们必须有一个离散的范围成员集,而不是一个连续的集合。我们使用succ创建离散范围。整数肯定是离散的

所以我构建了一个名为Apple的类。如您所见,我定义了比较运算符方法和succ方法,因为我需要一个离散范围:

class Apple
 attr_accessor :val

 def initialize(val)
  @val = val
 end

  def <=>(other)
    if @val > other.val
      1
    elsif @val == other.val
      0
    else
      -1
    end
  end

  def succ
    val.succ
  end
end
现在,我创建了三个苹果,我想得到一系列包含所有苹果的产品:

 a = Apple.new 1
 => #<Apple:0x00000001d3fa30 @val=1> 
 b = Apple.new 2
 => #<Apple:0x00000001d35210 @val=2> 
 c = Apple.new 3
 => #<Apple:0x00000001d2fbf8 @val=3> 
 (a..b).to_a
 => [#<Apple:0x00000001d3fa30 @val=2>] 

嗯,出人意料的事情发生了。我希望数组包括所有三个苹果。然而,它只返回了中间的苹果。我可能做错了什么?

首先,您的方法在elsif中的比较应该是与==double=not=:

其次,succ方法应该返回同一类的对象,并且您似乎返回的是integer/stringval.such,其中val分别是integer/string,而不是Apple类的对象。因此,它应该是:

def succ
  Apple.new(@val + 1) # or Apple.new(@val.succ)
end
进行这些更改后,代码似乎正常工作:

class Apple
  attr_accessor :val

  def initialize(val)
    @val = val
  end

  def <=>(other)
    @val <=> other.val
  end

  def succ
    Apple.new(@val + 1)
  end
end

a = Apple.new 1
b = Apple.new 2
c = Apple.new 3
puts (a..b).to_a
#=> [#<Apple:0x007fa10a97bc08 @val=1>, #<Apple:0x007fa10a97bb18 @val=2>]
puts (a..c).to_a
#=> [#<Apple:0x007fc8d3957b28 @val=1>, #<Apple:0x007fc8d3957858 @val=2>, #<Apple:0x007fc8d3957830 @val=3>]

你确定行elsif@val=other.val是故意的吗?如果你想让苹果反映@val和other.val的用法,那么就直接做吧。def其他@val other.val end。请删除IRB提示并正确设置代码格式@sawa,很好的简洁回答你的第一个评论。@sawa不,那是个打字错误。我的意思是==不是赋值=。我建议您删除最后一段代码,并在做了这些更改后以结束,它似乎工作正常。它真的没有添加任何东西。在做了这些更改后,代码似乎正常工作的示例可能会给出输出的样子。一切都是本着良好的精神进行的
def succ
  Apple.new(@val + 1) # or Apple.new(@val.succ)
end
class Apple
  attr_accessor :val

  def initialize(val)
    @val = val
  end

  def <=>(other)
    @val <=> other.val
  end

  def succ
    Apple.new(@val + 1)
  end
end

a = Apple.new 1
b = Apple.new 2
c = Apple.new 3
puts (a..b).to_a
#=> [#<Apple:0x007fa10a97bc08 @val=1>, #<Apple:0x007fa10a97bb18 @val=2>]
puts (a..c).to_a
#=> [#<Apple:0x007fc8d3957b28 @val=1>, #<Apple:0x007fc8d3957858 @val=2>, #<Apple:0x007fc8d3957830 @val=3>]