ruby - 需要帮助了解 Ruby 动态编程
问题描述
我需要帮助理解arr.partition(&a.method('>'))
正在做的事情。我知道它的动态,我们将一个方法作为一个块传递给 array.partition 方法。另外,如果不使用元编程,我将如何实现相同的目标
a=13
arr=[10,11,13,22]
left,right= arr.partition(&a.method('>'))
p left
p right
输出
[10, 11]
[13, 22]
[Finished in 0.3s]
解决方案
它与元编程无关,它是普通的老红宝石。
left, right = arr.partition(&a.method('>'))
这里真正发生的是:
- 获得一个
Method
类的实例,即(通过Integer#>
调用)Object#method
13
- 通过调用
Method#to_proc
(由于&
)将其转换为 proc - 将此过程作为一个块传递给
Array#partition
.
一步步:
> 13.method(:>)
#⇒ Integer#>(arg1)
> p = 13.method(:>).to_proc
#⇒ #<Proc:0x005652125f8b50 (lambda)>
> [10, 11, 13, 22].partition &p
#⇒ [[10, 11], [12, 13]]
可以通过以下方式实现相同的目的:
a = 13
arr = [10, 11, 13, 22]
left, right = arr.partition { |element| a > element }
#⇒ [[10, 11], [12, 13]]
推荐阅读
- javascript - 文本以不同的字体显示两次 | Javascript 画布
- angular - 由于 CORS,第 3 方 API 拒绝 HttpClient 获取请求 - 在浏览器和 powershell 中工作
- sql - SQL - 子查询,从选择中选择
- wordpress - 与不再存在的自定义字体混合的内容错误
- python - 两个列表的矩阵相减和结果的绝对值添加到新列表
- ios - 如何将可选字典中的项目转换为单个字符串
- c++ - 是 allocator_traits::deallocate 一个有效的 shared_ptr 删除器
- c# - 在 Visual Studio 中运行测试时不显示命令提示符
- java - 问:执行多个循环和多个 if 语句和 if-else 语句 | 租车计算器项目
- dart - 如何塑造容器?