- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在阅读这个关于 Rubymonk 的烦人教程,它要求我执行以下操作:
为我写三种方法——计算、加法和减法。测试应该全部通过。有问题就看提示!还有一点额外的提示:请记住,您可以使用 something.is_a?(Hash) 或 another_thing.is_a?(String) 来检查对象的类型。
我什至无法理解他们要我做什么,所以我决定看看解决方案,并努力对任务有一个体面的理解。
这是解决方案:
def add(*numbers)
numbers.inject(0) { |sum, number| sum + number }
end
def subtract(*numbers)
current_result = numbers.shift
numbers.inject(current_result) { |current_result, number| current_result - number }
end
def calculate(*arguments)
# if the last argument is a Hash, extract it
# otherwise create an empty Hash
options = arguments[-1].is_a?(Hash) ? arguments.pop : {}
options[:add] = true if options.empty?
return add(*arguments) if options[:add]
return subtract(*arguments) if options[:subtract]
end
最佳答案
添加(*数字)
让我们从调用开始:
def add(*numbers)
numbers.inject(0) { |sum, number| sum + number }
end
add(1,2,3) #=> 6
add(*[1,2,3]) #=> 6
numbers #=> [1,2,3]
reduce
)发送到
numbers
:
[1,2,3].inject(0) { |sum, number| sum + number }
inject
首先将“备忘录”
sum
的参数初始化为
inject
的参数(如果像这里一样,它有一个),然后将“接收者”的第一个元素
[1,2,3]
传递给 block 并将其分配给 block 变量
number
:
sum #=> 0
number #=> 1
sum + number #=> 0 + 1 => 1
inject
将
2
传递到 block 中并计算:
sum #=> 1
number #=> 2
sum + number #=> 3
sum
现在是
3
。
sum #=> 3
number #=> 3
sum + number #=> 6
inject
返回了备忘录的值:
sum #=> 6
inject
的文档,您会发现如果该方法没有参数,Ruby 会将接收器的第一个元素(此处为
1
)分配给备忘录(
sum
),然后从接收器的第二个元素开始如上所述继续(
2
)。正如预期的那样,这会产生相同的答案:
def add(*numbers)
numbers.inject { |sum, number| sum + number }
end
add(1,2,3) #=> 6
add()
(即
add(*[]))
返回零。我将留给您调查
inject
的两种形式中的每一种在此处发生的情况。您能得出什么结论?
def add(*numbers)
numbers.inject :+
end
numbers
可能是一个空数组,您需要为备忘录提供一个零初始值:
def add(*numbers)
numbers.inject 0, :+
end
add(*[]) #=> 0
def subtract(*numbers)
current_result = numbers.shift
numbers.inject(current_result) { |current_result, number|
current_result - number }
end
add
,但略有不同。我们需要备忘录的第一个值(这里是
current_result
)作为接收器的第一个元素。我们有两种方法可以做到这一点。
def subtract(*numbers)
numbers[1..-1].inject(numbers.first) { |current_result, number|
current_result - number }
end
numbers = [6,2,3]
subtract(*numbers) #=> 1
first_number = numbers.first #=> 6
all_but_first = numbers[1..-1] #=> [2,3]
numbers[1..-1].inject(numbers.first) { ... }
all_but_first.inject(first_number) { ... }
#=> [2,3].inject(6) { ... }
first_number = numbers.shift #=> 6
numbers #=> [2,3]
numbers.inject(first_number) { ... }
#=> [2,3].inject(6) { ... }
inject
不带参数:
def subtract(*numbers)
numbers.inject { |current_result, number| current_result - number }
end
numbers = [6,2,3]
subtract(*numbers) #=> 1
inject
的文档来了解其工作原理。
:add
,您可以编写:
def subtract(*numbers)
numbers.inject :-
end
subtract
要求
numbers
至少有一个元素,所以我们可以这样写:
def subtract(*numbers)
raise ArgumentError, "argument cannot be an empty array" if numbers.empty?
numbers.inject :-
end
calculate
期望以下列方式之一被调用:
calculate(6,2,3,{ :add=>true }) #=> 11
calculate(6,2,3,{ :add=>7 }) #=> 11
calculate(6,2,3,{ :subtract=>true }) #=> 1
calculate(6,2,3,{ :subtract=>7 }) #=> 1
calculate(6,2,3) #=> 11
:add
具有“真实”值(除
false
或
nil
之外的任何值,我们将添加;如果散列具有具有“真实”值的键
:subtract
(除
false
或
nil
之外的任何值,我们将如果最后一个元素不是散列(
calculate(6,2,3)
),则假定为
add
。
calculate(6,2,3,{ :add=>false }) #=> nil
calculate(6,2,3,{ :subtract=>nil }) #=> nil
def calculate(*arguments)
options =
if arguments.last.is_a?(Hash) # or if arguments.last.class==Hash
arguments.pop
else
{}
end
if (options.empty? || options[:add])
add *arguments
elsif options[:subtract]
subtract *arguments
else
nil
end
end
calculate(6,2,3,{ :add=>true }) #=> 11
calculate(6,2,3,{ :add=>7 }) #=> 11
calculate(6,2,3,{ :subtract=>true }) #=> 1
calculate(6,2,3,{ :subtract=>7 }) #=> 1
calculate(6,2,3) #=> 11
calculate(6,2,3,{ :add=>false }) #=> nil
calculate(6,2,3,{ :subtract=>nil }) #=> nil
return
关键字(在原始代码中也不需要)。使用散列来表示要执行的操作类型似乎很奇怪。调用该方法会更有意义:
calculate(6,2,3,:add) #=> 11
calculate(6,2,3) #=> 11
calculate(6,2,3,:subtract) #=> 1
def calculate(*arguments)
operation =
case arguments.last
when :add
arguments.pop
:add
when :subtract
arguments.pop
:subtract
else
:add
end
case operation
when :add
add *arguments
else
subtract *arguments
end
end
def calculate(*arguments, op=:add)
case op
when :subtract
subtract *arguments
else
add *arguments
end
end
calculate(6,2,3,:add) #=> 11
calculate(6,2,3) #=> 11
calculate(6,2,3,:subtract) #=> 1
关于ruby - 为什么在这个任务中使用 Ruby 的 Array#shift?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31660079/
我正在尝试实现 Intellij 之类的双类导航。我发现它被称为“快速打开文件”的“序列键绑定(bind)”。 因此,我在 .sublime-keymap --- USER 中添加了这一行 { "
this.x = (Math.random()*canvasWidth); this.y = (Math.random()*canvasHeight); (1) this.shift = {x: th
我目前正在研究编译器,据我了解,在 LR(0) 中,有时会出现“shift/reduce”或“reduce/reduce”冲突,但不可能出现“shift/shift”冲突!为什么我们不能发生“转变/转
我希望使用 AutoHotKey 来修改我的 shift 键的功能。 Steve Losh 的博客条目 here 中描述了该功能。 .具体来说,我希望我的 shift 键执行以下操作: 如果 LShi
在我的Redis数据库中,我有一个以prefix:格式保存的键列表,所以示例数据库看起来像这样:。问题是,当我尝试删除前缀:1时,因为无论出于什么原因,我都需要删除IPSUM,在索引之间留下了一个间隙
在我的Redis DB中,我有一个以prefix:格式保存的键列表,因此示例数据库如下所示:。问题是,当我尝试删除前缀:1时,因为无论出于什么原因,我都需要删除IPSUM,在索引之间留下了一个间隙--
Listview 控件中是否有可以上下移动项目的功能? 最佳答案 我没有太多使用 TListView(我主要使用数据库网格),我把你的问题作为学习一些东西的机会。下面的代码是结果,它比大卫的答案更直观
我有点难以发现这两种操作的不同之处。所以我读到算术移位与逻辑移位基本相同,唯一的区别是它以某种方式保持最高位或有符号位。 所以当我在 101110 上做 LSL #2 时假设这个二进制是一个无符号的,
我正在尝试使用 shift+shift 配置键映射,这可能吗? 我试过: But this maps shift + S and this that maps to unknown 最佳答案 您不
我正在努力在 vim 中绑定(bind) Shift+- 组合。我已经尝试了以下两种选项,但都没有可用的选项,并且谷歌搜索没有带来任何相关信息。 nnoremap - nnoremap - 我正在
我正在使用基于Gallery 的Cover-flow,正如建议的那样here . 是否有可以捕获的事件表明在我的画廊/封面流中进行了一次移位(向左或向右)? 需要明确的是,如果我给画廊一个像样的滑动并
这个问题在这里已经有了答案: Cocoa - NSEvent Respond to the SHIFT key? (5 个答案) 关闭 3 年前。 我正在制作这个应用程序,我想检测是否检测到 shi
我不允许在我的 C 代码中使用浮点变量(出于性能原因)。我想进行整数除法运算,同时我想尽可能地防止除法损失。 我的理解是,如果分子很大,除法运算会产生很好的结果。目前我正在对分子进行左移操作以使其成为
我有一个文本输入,当用户按下 shift(keydown)并绑定(bind)一个监听器以监听 shift 键时,它现在变得透明 即。 $('#foo').keydown(function(){
我有一个包含 shift 命令的 bash 脚本。 它在 bash 中运行正常,但在 zsh 环境中,shift 命令似乎不同。 zsh $ shift shift: shift count must
我正在使用 Fedora 29 中包含的 vim: VIM - Vi IMproved 8.1(2018 年 5 月 18 日,2019 年 2 月 4 日 14:19:12 编译) 我刚刚注意到按
我有一个包含 shift 命令的 bash 脚本。 它在 bash 中运行正常,但在 zsh 环境中,shift 命令似乎不同。 zsh $ shift shift: shift count must
我正在使用 Fedora 29 中包含的 vim: VIM - Vi IMproved 8.1(2018 年 5 月 18 日,2019 年 2 月 4 日 14:19:12 编译) 我刚刚注意到按
我可以使用 UITextViewDelegate 或 NSNotificationCenter 来检测用户何时点击 Keyboard 上的字符键将文本输入到 UITextView. 但我的应用程序需要
当我尝试单击 shift + tab 组合时, Shiftkey 被触发 $("#buttonZZ").on("keydown",function (eve) { if (eve.keyCod
我是一名优秀的程序员,十分优秀!