在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
今天看到了这篇文章--Five Ruby Methods You Should Be Using,感觉收获颇丰,先简单翻译一下先。 作者写这篇文章的契机是在Exercism上看到了很多ruby代码可以用更好的方式去重构,因此他分享了一些冷门的但是非常有用的ruby方法。 Object#tap你是否曾发现在某个对象上调用方法时返回值不是你所预期?你想返回这个对象,但是返回的时候又想对这个对象进行一些修改。比方说,你想给hash对象增加1个key value,这时候你需要调用Hash.[]方法,但是你想返回的是整个hash对象,而不是具体的某个value值,因此你需要显示的返回该对象。
最后一行的那个params显得有些多余了。 我们可以用 tap方法用起来非常简单,直接在某个对象上调用tap方法,然后就可以在代码块里yielded这个对象,最后这个对象本身会被返回。下面的代码演示了如何使用tap方法来重构刚才的实现。
有很多地方都可以使用到 Array#bsearch我不清楚你的情况,但我经常在数组里去查找数据。ruby的enumerable模块提供了很多简单好用的方法 如果你正在使用ActiveRecord和非NO SQL的数据库,查询的算法复杂度是经过优化了的。但是有时候你需要从数据库里把所有的数据拉出来进行处理,比方说如果你加密了数据库,那就不能好好的写sql做查询了。 这时候我会冥思苦想以找到一个最小的算法复杂度来筛选数据。如果你不了解算法复杂度,也就是这个O,请阅读 Big-O Notation Explained By A Self-Taught Programmer或[Big-O Complexity Cheat Sheet](http://bigocheatsheet.com/)。 一般来说,算法复杂度越低,程序运行的速度就越快。 当我们搜索数组的时候,一般第一个想到的方法便是 更好的办法是使用(Array#bsearch)[http://www.ruby-doc.org/core-2.1.5/Array.html#method-i-bsearch]方法。该方法的算法复杂度是O(log n)。你可以查看Building A Binary Search这篇文章来该算法的原理。 下面的代码显示了搜索50000000个数字时不同算法之间的性能差异。
如你所见, Enumerable#flat_map考虑这种情况,你有个blog应用,你希望找到上个月有过评论的所有作者,你可以会这样做:
得到的结果看起来会是这样的
不过你想得到的是所有作者,这时候你大概会使用
另一个选择是使用
这跟使用flatten方法没什么太大的不同,不过看起来会优雅一点,毕竟不需要反复调用flatten了。 Array.new with a Block想当年我在一个技术训练营,我们的导师Jeff Casimir同志(Turing School的创始人)让我们在一小时内写个Battleship游戏。这是极好的进行面向对象编程的练习,我们需要Rules,Players, Games和Boards类。 创建代表Board的数据结构是一件非常有意思的事情。经过几次迭代我发现下面的方法是初始化8x8格子的最好方式:
上面的代码是什么意思?当我们调用
当你传入一个block,这时候block的返回值会被当成是数组的每个元素。
因此,当你向block传入1个具有8个元素的数组时,你会得到8x8个元素的嵌套数组了。 用Array#new加block的方式可以创建很多有趣和任意嵌套层级的数组。 <=>这个方法就很常见了。简单来说这方法是判断左值和右值的关系的。如果左值大于右值返回1,相等返回0,否则返回-1。 实际上 这是作者的在现实生活中所用到的例子:
这个方法不是很好理解,大概的意思就是如果minutes超过60的话,小时数+1,等于60小时数不变,否则-1。 讨论会的方法越多写出来的代码可能会更有表现力,边写代码边改进,另外多读rubydoc。 |
2023-10-27
2022-08-15
2022-08-17
2022-09-23
2022-08-13
请发表评论