在 Racket 中,函数名以感叹号 (!) 结尾是一种命名约定,具有特殊的含义:
- 副作用:
以 ! 结尾的函数通常表示这个函数会产生副作用。副作用指的是函数除了返回一个值之外,还会修改某些状态或执行某些操作。 - 原地修改:
对于数据结构操作,! 通常表示这个函数会直接修改传入的数据结构,而不是创建一个新的副本。 - 可变性:
! 暗示这个函数可能涉及到可变数据的操作。 - 警告:
! 也可以看作是一种警告,提醒程序员这个函数可能会改变程序的状态。
一些常见的例子:
-
set!
: 用于改变变量的值。 -
vector-set!
: 修改向量中的一个元素。 -
hash-set!
: 在哈希表中添加或修改键值对。 -
string-set!
: 修改字符串中的一个字符。
对比:
(define v (vector 1 2 3))
; 不修改原向量,返回新向量
(define v2 (vector-append v #(4 5)))
; 直接修改原向量
(vector-set! v 0 10)
在函数式编程范式中,通常倾向于使用不产生副作用的函数。但在某些情况下,出于性能或其他考虑,使用带副作用的函数是必要的或更有效的。
使用这种命名约定可以帮助程序员快速识别哪些函数可能会改变程序状态,从而更谨慎地使用它们,并更容易理解和维护代码。
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于