在 Ruby 中,一个常见的模式是创建一个既作为获取器(getter)又作为设置器(setter)的方法。例如,如果向方法传递了值,它可能会更新设置;如果没有提供值,它可能会返回当前的设置。然而,使用标准的默认参数如 `value = nil` 会产生逻辑冲突:代码无法区分用户是故意传递 `nil` 来清除设置,还是用户什么也没传递以读取当前设置。虽然两者最终都会导致 `value` 为 `nil`,但它们在方法的契约中代表了不同的意图。

文章讨论了一种特定的 Ruby 编程技术,Chris Zempel 是这一技术见解的主要作者/来源。
为了解决这个问题,开发者通常不得不创建一个唯一的常量,例如 `NOT_PROVIDED = Object.new.freeze`,并检查输入是否等于该特定对象。虽然这种方法有效,但它引入了额外的样板代码,并且需要管理额外的常量。一种更简洁的技术涉及利用 Ruby 评估默认参数的方式。通过定义一个包含赋值的默认参数的方法——例如 `def cloaking(value = (nothing_provided = true))`——开发者可以创建一个仅在省略参数时触发的本地标志。
这种机制之所以有效,是因为 Ruby 仅在调用者未提供任何输入时才会评估默认参数表达式。在这种情况下,`nothing_provided` 被设为 `true`,且 `value` 变为 `true`。如果调用者提供了任何参数,即使是 `nil` 或 `false`,Ruby 也会完全跳过默认表达式。在这些情况下,本地变量 `nothing_provided` 仍然存在,但保持为 `nil`,因为赋值从未执行。这允许方法根据参数是否真正缺失来分支逻辑。这种模式在 Rails 框架的 `index_with` 方法中被显著用于处理可选默认值和块逻辑。
尽管具有实用性,这种技术仍是一种特殊的方法,一些开发者认为它不如使用标准的 Ruby 设置器语法整洁。虽然“默认参数中的赋值”技巧提供了一种处理双重用途方法的巧妙方式,但它依赖于 Ruby 解释器的特定行为,这可能不如显式的方法重载直观。对于许多使用场景,标准的 Ruby 惯例——例如为获取和设置值定义独立的方法——仍然是保持代码清晰、可读的首选方式。