- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
我知道 each_with_object
不适用于像 integer
这样的不可变对象(immutable对象)。
例如 (1..3).each_with_object(0) {|i,sum| sum += i} #=> 0
我们可以通过注入(inject)来解决这个问题,总和将为 6
。太棒了!
再举个例子
("a".."c").each_with_object("") {|i,str| str += i} # => ""
这也行不通,因为当我们执行 str+=i
时,我们创建了一个新对象
相反,我们需要做
("a".."c").each_with_object("") {|i,str| str << i} # => "abc"
为什么当我用以下两种方式inject
时得到奇怪的结果
("a".."c").inject("") {|i,str| str += i} # => cba
("a".."c").inject("") {|i,str| str << i} # => ERROR
为什么第一个打印的abc
是反着写的?为什么第二个是错误的?
我知道我们应该对可变对象使用.each_with_object
,对不可变对象(immutable对象)使用inject
(比如Integer
),但是我可以使用吗.inject
用于可变对象,就像 .each_with_object
一样?谁能解释这些结果?
最佳答案
Why is the first printing abc in reverse?
参数是倒退的。参见Enumerable#inject .
打印 i
和 str
显示问题。
$ ruby -e '("a".."c").inject("") {|i,str| puts "i = #{i}"; puts "str = #{str}"; ret = str += i; puts "ret = #{ret}\n\n"; ret }'
i =
str = a
ret = a
i = a
str = b
ret = ba
i = ba
str = c
ret = cba
i
是最后一次通过区 block 返回的累加和。 str
是下一个值。您正在将先前的累积值添加到下一个的末尾。你有倒退的论据。第一个是和,第二个是下一个元素。
纠正后,它工作正常。
$ ruby -e 'puts ("a".."c").inject("") {|sum,i| sum += i}'
abc
此外,它是使用的 block 的返回值。改变 str
没有任何效果,它只会让事情更加困惑。
$ ruby -e 'puts ("a".."c").inject("") {|sum,i| sum + i}'
abc
And why is the second an error?
它不是,无论如何在 Ruby 2.0.0 或 2.2.4 中都不是。但它也有向后参数的问题。
$ ruby -e 'puts ("a".."c").inject("") {|i,str| str << i} # => ERROR'
cba
$ ruby -v
ruby 2.2.4p230 (2015-12-16 revision 53155) [x86_64-darwin15]
关于ruby - .inject 与 .each_with_object 分析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39151803/
我想用 index 做 a.each_with_object,比这更好: a = %w[a b c] a.each.with_index.each_with_object({}) { |arr, ha
我正在尝试弄清楚应该如何使用 each_with_object。 我有一个不起作用的求和示例: > (1..3).each_with_object(0) {|i,sum| sum+=i} => 0 我
下面,我们得到一个名为 win_lose 的数组。我们应该创建一个看起来像下面的哈希的哈希。我最初的想法是使用 .count 做一些事情,但在尝试了答案之后,.each_with_object 的效果
根据 APIdock ,Ruby 方法 Enumerable#each_with_object 已弃用。 除非它是错误的(说“在最新稳定版本的 Rails 上弃用”让我怀疑可能是 Rails 的猴子补
这个问题在这里已经有了答案: Strange, unexpected behavior (disappearing/changing values) when using Hash default
我知道 each_with_object 不适用于像 integer 这样的不可变对象(immutable对象)。 例如 (1..3).each_with_object(0) {|i,sum| sum
我想在散列上使用 each_with_object 但不知道应该如何使用它。这是我所拥有的: hash = {key1: :value1, key2: :value2} hash.each_with_
我不得不更新一个数组,我使用了 +=和 <<在传递给 Array#each_with_object 的 block 内的不同代码运行中: 代码1 (1..5).each_with_object([])
为什么在 each_with_object 中使用 0 作为参数没有返回正确的值: [1,2,3].each_with_object(0) {|i,o| o += i } # => 0 但是使用空数组
我对以下 Ruby 行为感到困惑: result = [1,2,3].each_with_object([]) do |elem, memo| memo [[1], [2], [3]] 上面的代
文档说: enum#each_with_object :- Iterates the given block for each element with an arbitrary object, ob
我做了一些基准测试: require 'benchmark' words = File.open('/usr/share/dict/words', 'r') do |file| file.each
#each_with_object和 #inject都可以用来构建哈希。 例如: matrix = [['foo', 'bar'], ['cat', 'dog']] some_hash = matri
当我多年前开始编写 Ruby 时,我花了一段时间才理解 each 之间的区别。和 map .当我发现所有其他的时,情况只会变得更糟 Enumerable和 Array方法。 借助官方文档和many S
我们正在从 Ruby 1.9.3 升级到 Ruby 2,从 Rails 3.x 升级到 Rails4。我们正在使用设计进行身份验证。我们基于 Ryan Bates Railscasts 升级了 gem
我是一名优秀的程序员,十分优秀!