C 语言布局体中的函数指针与 Kotlin 高阶函数的对比

打印 上一主题 下一主题

主题 1854|帖子 1854|积分 5562

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
在学习 C 语言的过程中,很多 Java/Kotlin 背景的开发者都会对布局体中出现的“函数指针”感到生疏。特别是当看到如下代码时:
  1. struct Animal {
  2.     void (*speak)(void);
  3. };
  4. void dogSpeak() {
  5.     printf("Woof!\n");
  6. }
  7. int main() {
  8.     struct Animal dog;
  9.     dog.speak = dogSpeak;
  10.     dog.speak();
  11.     return 0;
  12. }
复制代码
这段代码中,布局体 Animal 中的 speak 并不是一个平常变量,而是一个“函数指针”。它的作用是:指向一个函数,然后在合适的时机调用它。这其实与我们在 Kotlin 中使用高阶函数的目标如出一辙。
一、C 中布局体里的函数指针

函数指针的语法大概略显复杂,但本质很简单:


  • void (*speak)(void) 表示一个函数指针,它指向一个没有参数、返回值为 void 的函数。
  • 给它赋值时,只需要提供函数名(不加括号)。
  • 调用时使用 布局体变量.函数指针() 的方式实行。
函数指针的最大利益是:可以将函数“作为变量”赋值和传递,从而实现雷同回调、战略模式等逻辑。
二、Kotlin 中的高阶函数

Kotlin 提供了原生的高阶函数支持,好比下面这个例子:
  1. fun runTwice(block: () -> Unit) {
  2.     block()
  3.     block()
  4. }
  5. fun main() {
  6.     runTwice { println("Hello") }
  7. }
复制代码
这里,block: () -> Unit 就是一个“函数类型的参数”,你可以将任何匹配这个署名的 lambda 或函数传入它。
Kotlin 的高阶函数与 C 的函数指针的本质是一样的:将函数作为“值”举行传递、赋值和调用
三、类比与思索

概念C 语言Kotlin函数作为变量函数指针高阶函数(函数类型)放入布局/对象中布局体中的函数指针成员类/对象中的函数属性调用方式对象.函数指针()对象.函数()使用目标实现回调、战略、接口模仿回调、DSL、扩展性逻辑
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

石小疯

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表