c ==自我和收益是做什么的?

时间:2013-11-20 15:42:39

标签: ruby

你能帮我理解这门课的作用以及我们如何使用它吗?

class Integer
    def myt
        c=0
        until c == self
            yield(c)
            c+=1
        end
        self
    end
end

谢谢。

x = Integer.new
x.myt

我试过测试它但不起作用。错误是:“没有给定块(产量)”

另外,在我的书中它说要测试这样: 5.myt (|| puts "I'm on iteration #{i}! "}但它也会出错 - 不确定这行代码的含义或含义。

4 个答案:

答案 0 :(得分:3)

allonhadaya和PNY很好地解释了myt方法的目的(枚举)。

关于标题中提到的两个问题:

1。)'c == self'做什么?

'=='运算符检查您实例化的整数c和整数对象的值是否相等。如果是,则表达式的计算结果为true。

2。)'收益'做什么?

'yield'语句将控制从当前方法传递给已提供给方法的块。块是ruby的闭包实现,简单来说,意味着只要方法支持块(即包含yield语句),就可以通过使用一块附加代码调用方法来“扩展”方法

答案 1 :(得分:2)

看起来它枚举零包含和自我排列之间的值。

allon@ahadaya:~$ irb
irb(main):001:0> class Integer
irb(main):002:1>     def myt
irb(main):003:2>         c=0
irb(main):004:2>         until c == self
irb(main):005:3>             yield(c)
irb(main):006:3>             c+=1
irb(main):007:3>         end
irb(main):008:2>         self
irb(main):009:2>     end
irb(main):010:1> end
=> nil
irb(main):011:0> 5.myt { |i| puts i }
0
1
2
3
4
=> 5
irb(main):012:0>

答案 2 :(得分:2)

该方法似乎是times实现。

基本上5.times { |i| puts i }5.myt { |i| puts i }会做同样的事情。

首先,它将计数器设置为0,c = 0。然后你有一个条件,它检查c是否等于self,它始终是附加到方法myt的整数。它然后产生计数器,并在完成后返回self

答案 3 :(得分:0)

使用你的书给出的例子 -

5.myt {|i| puts "I'm on iteration #{i}! "} 
#You were missing an object in the pipes and a curly bracket before the pipes (not parentheses)

允许您查看myt方法的内部工作方式。初始化变量c的值为0,该方法执行直到查找条件" c == self"很满意。自我引用了这个方法所依据的对象,这就是5。

因此......

def myt
  until c == 5 #Until this is true  
    yield(c) #Do this .. here yield will do whatever the block specified
    c+=1 #Increment on each iteration the value of variable c by 1
  end #closing the until loop
  self #return self 
end

方法中的yield将控制从您的方法传递给参数,块,返回到方法。

因此,

Yield允许您构建可以具有类似模式的方法,但是使用块可以自定义它以满足您的特定需求。

如果不是将每个数字放在一起,而是将所有想要做的奇数整数放在0和你调用方法的整数之间 -

5.myt {|i| puts i if i.odd?} # returns I am odd: 1 and I am odd: 3

我建议您在这里编写自己的块,以了解yield如何工作以及如何保持相同的方法,但传入不同的块并创建不同的方法输出!