gpt4 book ai didi

ruby - 我是否正确理解这段代码的工作原理?

转载 作者:数据小太阳 更新时间:2023-10-29 08:59:39 25 4
gpt4 key购买 nike

基本上,我正在尝试使用 Ruby 解决第一个 Project Euler 问题。 Here是这个问题,如果你想知道以供引用。我尝试自己从头开始解决这个问题,但并没有那么顺利,所以我决定走另一条路:在网上找到别人的解决方案,将其分解,向自己解释并尝试看看我是否可以构建如果我能准确地弄清楚他们的代码在做什么,我自己独特的解决方案。根据我的经验,这始终是我学习的最佳方式。这是我找到并决定拆开的解决方案:

puts (1..1000).select{ |n| n % 3 == 0 || n % 5 == 0 }.reduce(:+)

我找到了这个解决方案 here .基本上,我想要的不是“告诉我问题的答案”,而是更多的是“读我的笔记,告诉我什么是对的,什么是错的,然后一步步给我分解问题”。再一次,如果这不是 SO 的正确使用,我很抱歉!我不确定还有什么地方可以问,如果这不是我应该问的地方,我会删除我的问题。 :) 这是我对代码的注释以及我是如何向自己解释的:

  • it puts numbers 1-999 ("range") down

  • then selects it with ".select". the curly brackets are used almost like css, but are more similar to "do" and "end" in Ruby ("do" starting a command and "end" ending it). The difference between "do/end" and curly brackets are that curly brackets are for commands that can fit into one line rather than needing several lines.

  • | | = the pipelines define a "block" whereas "n" stands for numeral/number. it's a block with a variable inside of it. this means that |n| asks the command to bring up a number from the selected range.

  • "n % 3" looks for multiples of 3; == 0 looks for the answer(?). repeat for five.

  • then ".reduce(:+)" shortens the command by summing all of the numerals together.

我对自己的理解有点自信,但如果有任何不妥(术语、一般概念等),我很乐意让我知道并解释一下!我真的只是在尝试学习和分解事物并向自己解释它们通常对我帮助最大。

最佳答案

在简单的英语中,该语句打印出 1 到 1000 之间每个可被 3 或 5 整除的数字的结果,并返回集合的总和 (234168)。

puts 只是一个简单的打印命令,它写入输出缓冲区(默认为 STDio)。 puts 在每个参数后添加一个换行符。 print 没有。

.select
Returns an array containing all elements of enum for which the given block returns a true value.

所以是的,在这种情况下,它允许任何可被 3 或 5 整除的值

irb(main):005:0> (1..10).select{ |n| n % 3 == 0 || n % 5 == 0 }
=> [3, 5, 6, 9, 10]

the curly brackets are used almost like css, but are more similar to "do" and "end" in Ruby

我不太确定与 CSS 的相似性,因为 CSS 只是一种声明性语言。

大括号和do ... end 都是Ruby 声明 block 的方式——它们只是匿名函数。编译器实际上并不关心,会让您编写带括号的多行语句。然而,有一个强大的社区约定,do ... end 应该优先用于较长的语句。

在带有 Underscore 库的 Javascript 中,它看起来像这样:

console.log( 
_.filter(
_.range(1, 10), function(n){ n % 3 == 0 || n % 5 == 0 }
)
);

reduce(sym) → obj

Combines all elements of enum by applying a binary operation, specified by a block or a symbol that names a method or operator.

因此,reduce 获取我们从 select 中获得的数组并将元素相加。 :+ 其实就是我们在'memo'上调用的方法。

[1,2,3].reduce(:+)

也可以写成:

[1,2,3].reduce { |memo, obj| memo.send(:+, obj) }
# or
[1,2,3].reduce { |memo, obj| memo.+(obj) }

这可能看起来有点奇怪,但请记住,在 Ruby 中,一切都是对象。 + 实际上是FixNum 上的一个方法class 而不是其他语言中的关键字。

所以 Ruby 中的 1 + 2 实际上是 1.+(2) 的语法糖。

关于ruby - 我是否正确理解这段代码的工作原理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39571116/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com