ルビィの Ruby 教室

想成为 Ruby girls 的众人,在露比老师的编程教室上?

1话 方法好像有点多

露比「昨天的课程大家记住了吗」

千歌「递归、算法…这么难的东西,完全不懂啊」

露比「算法暂时用不到的啦」

曜「露比酱,为什么我们要学 ruby 啊」

露比「比起C,ruby更加简单呦(其实是和我名字相同啦)」

千歌「唔哇,还有更加难的语言,好可怕」

露比「今天的课题是链表,首先构建 ListNode 类试下」

1
2
3
4
5
6
7
class ListNode
attr_accessor :val, :next_node
def initialize(val)
@val = val
@next_node = nil
end
end

露比「val 是结点的值,next_node 是指向下一个结点。好,来试试遍历一下」

曜「遍历的话,一直循环到尾结点」

1
2
3
4
5
6
def order_traversal(head)
until head.nil?
puts head.val
head = head.next_node
end
end

露比「嗯,要是再将链表转换成数组呢」

千歌「我知道我知道,把输出换成数组赋值」

1
2
3
4
5
6
def order_traversal(head, array)
until head.nil?
array << head.val
head = head.next_node
end
end

千歌「嘿嘿,千歌我还是会一点的哟」

露比「要是再将计数呢」

千歌「那再改…」

曜「要是每个都这样改,方法好像有点多啊」

千歌「额,那怎么办呀」

2话 用块就可以啦ずら

曜「要不问下其他小队」

夜羽「くくく,愚昧的凡人啊,就让堕天使夜羽给你们展示下黑魔法」

1
2
3
def operator(head, name, *args)
send(name, head, *args)
end

夜羽「只要用 send 方法,可以省略成一个方法,并且传多少值都没问题」

花丸「用了 send 也还是要定义其他方法,根本没有解决ずら」

露比「其实这个可以用块简化一下」

1
2
3
4
5
6
7
8
9
def traversal(&block)
yield
next_node.traversal(&block) if next_node
end

list.traversal { |x| puts x.val }

array = []
list.traversal { |x| array << x.val }

千歌「露比老师真厉害」

梨子「看起来有点不对,测试一下」

1
NoMethodError: undefined method `val' for nil:NilClass

夜羽「难道是被天界的敌人偷走了」

梨子「看起来不行啊,夜酱,天界不会影响代码运行的啦」

露比「诶,这个…呜呜姐姐」

黛雅「露比,你啊没有指向 self。假如不涉及取值,yield 代指的块中代码运行没问题,要是有取值不指定就会返回nil」

众人「原来如此」

花丸「果然改为 yield(self) 就好了,未来ずら」

3话 深入递归

鞠莉「wow,ruby 比起 american 的 C 有趣多了」

鞠莉「要是反转输出呢」

千歌「先一个一个移动,到尾结点再往回输出,啊不好,找不到前面的结点了」

果南「听说有个栈可以后入先出」

梨子「递归也是运用栈,刚才的遍历就用了递归。那把 yield(self) 位置移动一下就可以先递归到尾结点」

1
2
3
4
def reverse_traversal(&block)
next_node.reverse_traversal(&block) if next_node
yield(self)
end

4话 Ruby girls

鞠莉「Amazing!ruby 真是优雅呢」

果南「这么有趣的语言,我也提起兴趣了呢」

露比「深入学习的话,还有更多优雅的特性等着我们」

夜羽「くくく,堕天使夜羽早已窥见禁忌的元编程法术。小恶魔们放心,夜羽可不会被反噬的」

花丸「刚才就乱用了ずら」

夜羽「呀,才没有呢,ずら丸」

曜「既然学习了 ruby,那我们就是 ruby girls 了呢」

梨子「ruby girls,听起来不错呢」

黛雅「『学而时习之,不亦说乎』要掌握知识还得要多加练习」

千歌「嗯,为了成为更加闪耀的 ruby girl,还要继续努力练习啊,大家一起加油吧」

众人「哦~~」


ルビィの Ruby 教室
https://blog.ckyol.moe/2018/08/11/rubyProgLesson/
作者
ϵ( 'Θ' )϶
发布于
2018年8月11日
许可协议