- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
有人可以向我解释下面的代码在做什么吗? before
和 after
是哈希值。
def differences(before, after)
before.diff(after).keys.sort.inject([]) do |diffs, k|
diff = { :attribute => k, :before => before[k], :after => after[k] }
diffs << diff; diffs
end
end
它来自 papertrail differ gem。
最佳答案
毫无疑问,这是密集的代码。因此,正如您所说,before
和 after
是作为参数传递给方法的散列(类似?)对象。调用 before.diff(after)
返回另一个散列,然后立即调用 .keys
。这将返回 diff
返回的散列中的所有键。键作为数组返回,然后立即排序。
然后我们进入最复杂/最密集的部分。在排序的键数组上使用 inject
,该方法构建一个数组(在 inject
block 中称为 diffs
),这将是返回值inject
方法。
该数组由差异记录组成。每条记录都是一个散列 - 通过从 before.diff(after)
返回值的已排序键数组中取出一个键来构建。这些散列存储被差异化的属性,它在前哈希中的样子以及在后哈希中的样子。
因此,简而言之,该方法获取两个哈希值之间的一堆差异,并将它们收集到一个哈希值数组中。该哈希数组是该方法的最终返回值。
注意:inject
可以而且通常比这简单得多。通常它用于通过一遍又一遍地应用一个操作并将结果存储在累加器中来简单地将一组值减少为一个结果。您可能从其他语言中将 inject
理解为 reduce
; reduce
是 Ruby 中 inject
的别名。下面是一个更简单的 inject
示例:
[1,2,3,4].inject(0) do |sum, number|
sum + number
end
# => 10
0 是累加器——初始值。在 |sum, number|
对中,sum
将是累加器,number
将是数组中的每个数字,一个接一个。 inject
做的是0加1,存入sum
用于下一轮,sum
加2,存入sum
再次等等。累加器 sum
的单个最终值将是返回值。这里是 10。您的示例中增加的复杂性是累加器与 block 内的值在种类上不同。这种情况不太常见,但还不错,也不错。 (编辑:Andrew Marshall 提出了好的观点,但也可能是坏的。请参阅他对原始问题的评论。@tokland 指出,inject
这里只是一个非常 map 的过于复杂的替代方案。它是不好的。)有关注入(inject)
的更多示例,请参阅我在您的问题的评论中链接到的文章。
编辑:正如@tokland 在一些评论中指出的那样,代码似乎只需要一个简单的map
。那样读起来会容易得多。
def differences(before, after)
before.diff(after).keys.sort.map do |k|
{ :attribute => k, :before => before[k], :after => after[k] }
end
end
我过于专注于解释代码的作用。我什至没有想到如何简化它。
关于ruby - 无法理解以下代码的作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11129505/
这个问题在这里已经有了答案: standalone parentheses in javascript [duplicate] (5 个答案) 关闭 8 年前。 我在学习JavaScript,有时会
我是mysql新手,我必须减少以下更新查询的执行时间 UPDATE temp_countcalculations, ( SELECT count(*) as insuffcounts,CRP_
def escape_html(s): for (i, o) in (("&","&"),(">", ">"),(" "变成 ">"等。 关于python - 以下 for 循环
if (read(read(cin, data1), data2)) 问题是C++ Primer 5th Edition 的练习。 read 函数定义如下: std::istream &read(st
我想创建两个宏。其中一个将扩展到函数原型(prototype)和函数内容,另一个将扩展到仅函数原型(prototype)。我正在考虑创建以下内容: #ifdef SOME_CONDITION #def
我正在使用 jongo API - org.jongo.MongoCollection 是类。 我有对象 ID 列表并转换为与 ObjectId[] 相同并尝试按如下方式查询 collection.f
有人可以解释以下正则表达式匹配什么吗? ^.*$ 谢谢! 最佳答案 或者整个字符串或者整行,取决于是否multiline mode被使用。 关于java - 以下 ^.*$ 正则表达式匹配什么?,我们
#include void main() { int a,b,c; for(b = c = 10; a = "- FIGURE?, UMKC,XYZHello Folks,TFy!QJ
我的代码段中的以下代码行被 Sonar 检测为问题。 代码段: final int Pending=1; Sonar 问题: Name 'Pending' must matc
Print name of all activities with neither maximum nor minimum number of participants 我尝试了以下查询,但出现错误:
这个问题在这里已经有了答案: What is this practice called in JavaScript? (7 个回答) 关闭8年前。 (function() { //do stuff
根据任务,我们必须通过 foldr 实现 foldl。通过比较函数签名和 foldl 实现,我得到了以下解决方案: myFoldl :: (a -> b -> a) -> a -> [b] -> a
这个问题在这里已经有了答案: Export an es6 default class inline with definition or at end of file? (1 个回答) 关闭 2 年
据我了解,以下是相同的: Person p{}; // Case 1 Person p = {}; // Case 1.5 我注意到 Person p = Person{}; // Case 2 产生
below i have given a javascript code picture `` can any one help me in this code. what do this code.
我想在标题和正文上搜索全文,并在答案计数上进行过滤。 我阅读了elasticsearch documentation for combining filters并构建了此查询。 "query": {
它是流动的 C 代码中的内存泄漏吗? #include int *a; int main() { a = malloc(sizeof(int)*10); return
这两个声明有什么区别: char (*ptr)[N]; 对比 char ptr[][N]; 谢谢。 最佳答案 (1)声明 char (*ptr)[N]; ptr 是指向大小为 N 的字符数组的指针 下
data II = I Int Int deriving (Show) instance II Show where show I a b = show (a+b) showt.hs:3:2: s
我从 clojuredoc 中阅读了关于 condp 的文档。在文档中我找到了以下代码: (condp 一些 [1 2 3 4] #{0 6 7} :>> 公司 #{4 5 9} :>> 十二月 #{
我是一名优秀的程序员,十分优秀!