设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
12
返回列表 发新帖
楼主: 赛露休斯
打印 上一主题 下一主题

[已经解决] 请教如何获取数组中某个值的元素个数

[复制链接]

Lv1.梦旅人

梦石
0
星屑
110
在线时间
953 小时
注册时间
2007-4-25
帖子
805
11
发表于 2010-12-8 21:07:26 | 只看该作者
回复 goahead 的帖子

用循环的话在 Ruby 1.8 效率确实更高,但这是一个程序设计泛型的问题。Lisp 的 foldl 这种折合机制是函数式语言的经典函数,只要是函数式语言背景占主要成分的程序员多半都会去用这个 Array#inject,而不是用命令式语言的循环。这里我们又再次看到了 Ruby 多泛型给我们带来的自由。

Ruby 1.9 的 Array#each 是这样:

  1. VALUE
  2. rb_ary_each(VALUE ary)
  3. {
  4.     long i;

  5.     RETURN_ENUMERATOR(ary, 0, 0);
  6.     for (i=0; i<RARRAY_LEN(ary); i++) {
  7.         rb_yield(RARRAY_PTR(ary)[i]);
  8.     }
  9.     return ary;
  10. }
复制代码
它比 1.8 多了一行 RETURN_ENUMERATOR(ary, 0, 0);
这是一个返回枚举器的例程,经费还是颇高的,我做过测试,单单比较 1.9 和 1.8 的 Array#each,1.8 的快许多。所以 1.9 的 each 只怕也比复杂的 Array#inject 快不了多少。
[email protected]:~> repeat 1 fortune
Matz is nice, so we are nice.
回复 支持 反对

使用道具 举报

头像被屏蔽

Lv1.梦旅人 (禁止发言)

梦石
0
星屑
50
在线时间
21 小时
注册时间
2007-7-3
帖子
573
12
发表于 2010-12-10 11:29:33 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
签名被屏蔽
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
110
在线时间
953 小时
注册时间
2007-4-25
帖子
805
13
发表于 2010-12-10 11:49:22 | 只看该作者
回复 goahead 的帖子

inject 没有调用 each。
[email protected]:~> repeat 1 fortune
Matz is nice, so we are nice.
回复 支持 反对

使用道具 举报

头像被屏蔽

Lv1.梦旅人 (禁止发言)

梦石
0
星屑
50
在线时间
21 小时
注册时间
2007-7-3
帖子
573
14
发表于 2010-12-10 11:56:08 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
签名被屏蔽
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
110
在线时间
953 小时
注册时间
2007-4-25
帖子
805
15
发表于 2010-12-10 12:45:44 | 只看该作者
回复 goahead 的帖子

我错了……
  1. rb_block_call(obj, id_each, 0, 0, iter, (VALUE)memo);
复制代码
inject 里有这么一行,id_each == "each"
看来写这个函数的人是想统一接口重用代码,但这样一来就损失效率了,inject 成了 each 的外壳,自然不可能比 each 快。

inject 的设计初衷是为了贯彻 Ruby 自由的哲学,在传统的迭代上再抽象一层,就有了习惯于函数式编程的人熟知的函数。

点评

inject来源于Enumerate模块,该模块的方法要求类必须先实现each方法。【摘自各种Ruby书籍】  发表于 2010-12-11 13:49
[email protected]:~> repeat 1 fortune
Matz is nice, so we are nice.
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-11-15 21:24

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表