- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
我在阅读有关.each
迭代器的Ruby问题,有人说如果更高阶的迭代器更适合该任务,则使用.each
可能会产生代码味道。 Ruby中的高阶迭代器是什么?
编辑:我提到的StackOverflow答案的作者JörgW Mittag提到他是要编写更高级别的迭代器,但他还解释了下面的内容。
最佳答案
哎呀。我的意思是更高级别的迭代器,而不是更高阶的迭代器。当然,每个迭代器都是高阶的。
基本上,迭代是一个非常低级的概念。编程的目的是与团队中的其他利益相关者交流意图。 “初始化一个空数组,然后遍历另一个数组,并将该数组的当前元素添加到第一个数组中(如果该数组可以被两个整除而没有余数的话),这并不是在传达意图。 “选择所有偶数”是。
通常,您几乎永远不会只是为了迭代而对集合进行迭代。你要么想要
map
,在Ruby和Smalltalk中为collect
,在.NET和SQL中为Select
),fold
或reduce
;在Smalltalk中,它是inject:into:
;在Ruby中是inject
;在.NET Aggregate
中) ,filter
,Smalltalk和Ruby中的select
,Ruby中的find_all
,.NET和SQL中的Where
),reject
)find
)count
)all?
),至少一个元素(any?
)或没有元素(none?
)满足条件group_by
)将元素分组到存储桶中partition
)将该集合分为两个集合sort
,sort_by
)进行排序zip
)reduce
。
inject
aka。
fold
aka。
inject:into:
aka。
Aggregate
aka。变态是你的 friend 。它之所以听起来如此花哨的数学名称是有原因的:它非常强大。实际上,我上面提到的大多数内容都可以根据
reduce
来实现。
reduce
的作用是使用某些函数将整个集合“缩减”为单个值。您有某种累加器值,然后取累加器值和第一个元素并将其输入到函数中。然后,该函数的结果将成为新的累加器,您可以将其与第二个元素配对并馈入该函数,依此类推。
[4, 8, 15, 16, 23, 42].reduce(0) {|acc, elem|
acc + elem
}
0
开头,然后将第一个元素
4
传递到
+
函数中。结果是
4
,它成为新的累加器。现在我们传入下一个元素
8
,结果是
12
。这一直持续到最后一个元素,结果是他们一直死了。不,等等,结果是
108
。
[4, 8, 15, 16, 23, 42].reduce {|acc, elem|
acc + elem
}
Symbol#to_proc
:
[4, 8, 15, 16, 23, 42].reduce(&:+)
reduce
传递给
Symbol
参数,它将被视为用于归约操作的函数的名称:
[4, 8, 15, 16, 23, 42].reduce(:+)
reduce
可以完成的全部工作。实际上,我发现此示例有些危险。我向所有人展示的这些内容立即理解为:“啊,这就是
reduce
的意思”,但是不幸的是,有些人还认为
reduce
就是所有数字的总和,而事实并非如此。实际上,
reduce
是一种通用的迭代方法,我的意思是
reduce
可以执行
each
可以执行的任何操作。特别是,您可以在累加器中存储任意状态。
reduce
将集合缩减为单个值。但是,当然,“单一值(value)”可能是任意复杂的。例如,它本身可以是一个集合。或字符串:
class Array
def mystery_method(foo)
drop(1).reduce("#{first}") {|s, el| s << foo.to_str << el.to_s }
end
end
Array#join
:
class Array
def join(sep=$,)
drop(1).reduce("#{first}") {|s, el| s << sep.to_str << el.to_s }
end
end
each
实现此功能,则必须以某种方式跟踪索引并检查是否在最后一个元素中,然后在其中添加一个
if
,以防止在末尾发出分隔符。
reduce
完成,所以我也可能会证明这一点。这是Ruby的
Enumerable
方法,是根据
reduce
而不是通常的
each
实现的。 (请注意,我才刚刚开始,才刚到达g。)
module Enumerable
def all?
reduce(true) {|res, el| res && yield(el) }
end
def any?
reduce(false) {|res, el| res || yield(el) }
end
alias_method :map, def collect
reduce([]) {|res, el| res << yield(el) }
end
def count
reduce(0) {|res, el| res + 1 if yield el }
end
alias_method :find, def detect
reduce(nil) {|res, el| if yield el then el end unless res }
end
def drop(n=1)
reduce([]) {|res, el| res.tap {|res| res << el unless n -= 1 >= 0 }}
end
def drop_while
reduce([]) {|res, el| res.tap {|res| res << el unless yield el }}
end
def each
reduce(nil) {|_, el| yield el }
end
def each_with_index
tap { reduce(-1) {|i, el| (i+1).tap {|i| yield el, i }}}
end
alias_method :select, def find_all
reduce([]) {|res, el| res.tap {|res| res << el if yield el }}
end
def grep(pattern)
reduce([]) {|res, el| res.tap {|res| res << yield(el) if pattern === el }}
end
def group_by
reduce(Hash.new {|hsh, key| hsh[key] = [] }) {|res, el| res.tap {|res|
res[yield el] = el
}}
end
def include?(obj)
reduce(false) {|res, el| break true if res || el == obj }
end
def reject
reduce([]) {|res, el| res.tap {|res| res << el unless yield el }}
end
end
each
应该返回
self
,因此您必须在其中打额外的一行。其他方法的行为略有不同,具体取决于您传入的种类和参数数量等等。我将这些内容排除在外是因为它们分散了我要提出的观点。]
关于ruby - Ruby中的高阶迭代器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3503846/
以下是一个非常简单的ruby服务器。 require 'socket' local_socket = Socket.new(:INET, :STREAM) local_addr = Socket.
我正在使用 OS X(使用 bash),并且是 unix 的新手。我想知道是否可以修改一些文件以便运行 ruby 程序,我不需要“ruby file.rb”,而是可以运行“ruby.rb”。 有理
我在用 Ruby 替换字符串时遇到一些问题。 我的原文:人之所为不如兽之所为。 我想替换为:==What== human does is not like ==what== animal does.
我想在一个循环中从 Ruby 脚本做这样的事情: 写一个文件a.rb(每次迭代都会改变) 执行系统(ruby 'a.rb') a.rb 将带有结果的字符串写入文件“results” a.rb 完成并且
我的问题是尝试创建一个本地服务器,以便我可以理解由我的新团队开发的应用程序。我的问题是我使用的是 Ruby 2.3.3,而 Gemfile 需要 2.3.1。我无法编辑 Gemfile,因为我被告知很
我有一个使用 GLI 框架用 Ruby 编写的命令行实用程序。我想在我的主目录中配置我的命令行实用程序,使用 Ruby 本身作为 DSL 来处理它(类似于 Gemfile 或 Rakefile)。 我
我的 Rails 应用 Controller 中有这段代码: def delete object = model.datamapper_class.first(:sourced_id =>
我正在寻找的解析器应该: 对 Ruby 解析友好, 规则设计优雅, 产生用户友好的解析错误, 用户文档的数量应该比计算器示例多, UPD:允许在编写语法时省略可选的空格。 快速解析不是一个重要的特性。
我刚开始使用 Ruby,听说有一种“Ruby 方式”编码。除了 Ruby on Rails 之外,还有哪些项目适合学习并被认可且设计良好? 最佳答案 Prawn被明确地创建为不仅是一个该死的好 PDF
我知道之前有人问过类似的问题,但是我该如何构建一个无需在前面输入“ruby”就可以在终端中运行的 Ruby 文件呢? 这里的最终目标是创建一个命令行工具包类型的东西。现在,为了执行我希望用户能够执行的
例如哈希a是{:name=>'mike',:age=>27,:gender=>'male'}哈希 b 是 {:name=>'mike'} 我想知道是否有更好的方法来判断 b 哈希是否在 a 哈希内,而
我是一名决定学习 Ruby 和 Ruby on Rails 的 ASP.NET MVC 开发人员。我已经有所了解并在 RoR 上创建了一个网站。在 ASP.NET MVC 上开发,我一直使用三层架构:
最近我看到 Gary Bernhardt 展示了他用来在 vim 中执行 Ruby 代码的 vim 快捷方式。捷径是 :map ,t :w\|:!ruby %. 似乎这个方法总是执行系统 Rub
在为 this question about Blue Ruby 选择的答案中,查克说: All of the current Ruby implementations are compiled to
我有一个 Ruby 数组 > list = Request.find_all_by_artist("Metallica").map(&:song) => ["Nothing else Matters"
我在四舍五入时遇到问题。我有一个 float ,我想将其四舍五入到小数点后的百分之一。但是,我只能使用 .round ,它基本上将它变成一个 int,意思是 2.34.round # => 2. 有没
我使用 ruby on rails 编写了一个小型 Web 应用程序,它的主要目的是上传、存储和显示来自 xml(文件最多几 MB)文件的结果。运行大约 2 个月后,我注意到 mongrel 进程
我们如何用 Ruby 转换像这样的字符串: 𝑙𝑎𝑡𝑜𝑟𝑟𝑒 收件人: Latorre 最佳答案 s = "𝑙𝑎𝑡𝑜𝑟𝑟𝑒" => "𝑙𝑎𝑡𝑜𝑟𝑟𝑒" s.u
通过 ruby monk 时,他们偶尔会从左侧字段中抛出一段语法不熟悉的代码: def compute(xyz) return nil unless xyz xyz.map {|a,
不确定我做错了什么,但我似乎弄错了。 问题是,给你一串空格分隔的数字,你必须返回最大和最小的数字。 注意:所有数字都是有效的 Int32,不需要验证它们。输入字符串中始终至少有一个数字。输出字符串必须
我是一名优秀的程序员,十分优秀!