惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
罗磊的独立博客
B
Blog RSS Feed
C
Check Point Blog
Project Zero
Project Zero
D
Docker
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
P
Palo Alto Networks Blog
L
LINUX DO - 热门话题
Scott Helme
Scott Helme
NISL@THU
NISL@THU
L
LangChain Blog
C
Cisco Blogs
Engineering at Meta
Engineering at Meta
Know Your Adversary
Know Your Adversary
雷峰网
雷峰网
S
Schneier on Security
MyScale Blog
MyScale Blog
博客园_首页
博客园 - 三生石上(FineUI控件)
C
CERT Recently Published Vulnerability Notes
美团技术团队
V
Visual Studio Blog
T
The Exploit Database - CXSecurity.com
Recent Announcements
Recent Announcements
G
GRAHAM CLULEY
T
Tor Project blog
V
Vulnerabilities – Threatpost
U
Unit 42
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
Stack Overflow Blog
Stack Overflow Blog
P
Privacy International News Feed
Security Latest
Security Latest
W
WeLiveSecurity
aimingoo的专栏
aimingoo的专栏
Hugging Face - Blog
Hugging Face - Blog
Google Online Security Blog
Google Online Security Blog
V2EX - 技术
V2EX - 技术
The Last Watchdog
The Last Watchdog
博客园 - Franky
T
Tenable Blog
云风的 BLOG
云风的 BLOG
D
DataBreaches.Net
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
Latest news
Latest news
N
News and Events Feed by Topic
Cloudbric
Cloudbric
Schneier on Security
Schneier on Security
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
Blog — PlanetScale
Blog — PlanetScale

博客园 - sizzle

软件单元测试之我见 非空判断 在COM中使用数组参数-SafeArray[转载] 指针赋值 - sizzle - 博客园 进程的深度隐藏 文件隐藏 Windows下网络数据报的监听和拦截技术 三键屏蔽 键盘知识 如何获取当前程序文件的路径 Net Remoting[转自Bruce Zhang's Blog] 解码 XML 和 DTD 【读书笔记】[Effective C++第3版][第27条]尽量不要使用类型转换 P2P之UDP穿透NAT的原理与实现 CommandBinding用法 窗体显示中Form.Show()和Form.ShowDialog()的区别 一段高深代码--未解 使用C#注销/关闭计算机 TEA加密算法的C/C++实现
ruby函数回调的实现方法
sizzle · 2016-01-15 · via 博客园 - sizzle

以前一直困惑ruby不像python,c可以将函数随意传递,然后在需要的时候才去执行。其实本质原因是ruby的函数不是对象。

通过查阅资料发现可以使用如下方法:

def func(a, b)
  puts a + b
end

f = method(:func)
f.call(1, 2)

上面是使用Method对象封装函数,然后就可以通过操作该Method对象实现函数的参数传递。

曾经一度认为上面方法才是将函数作为参数使用的正统方法,后来才发现原来是我太执着于c的函数指针的使用模式里,而没有真正体会到ruby block的精髓,使用block的实现方法:

def func(a, b)
  puts a + b
end

def use_func(a, b)
  yield a, b
end

use_func(1, 2) do |a, b|
  func a, b
end

说明一下用意:

将函数作为参数传递给其他对象,其实根本目的是让其他对象可以使用该函数,使用方法就如同use_func的实现,这时关心的内容其实仅仅是参数列表和返回值,也就是说我们可以使用block将func的“形”传递给use_func,而在真正需要使用func的时候再在block中执行func即可。

当然,举例的func实现过于简单,大家可能觉得只需要将puts语句放在block中即可,但是当实现内容增多或者需要重用时,func还是有存在的必要。