你能帮我理解这门课的作用以及我们如何使用它吗?
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}! "}
但它也会出错 - 不确定这行代码的含义或含义。
答案 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如何工作以及如何保持相同的方法,但传入不同的块并创建不同的方法输出!