I think this misses the point. `times` is "better" than `for` because it's declarative, reads like English, etc. Which of course are opinions, but the implementation details (messaging passing or not) are irrelevant.

Example: Swift and Kotlin can do `Int#times` and don't need message passing to get it done.

> but the implementation details (messaging passing or not) are irrelevant.

I'm the author here. While I agree that the implementation details do not matter for _most_ developers, I wanted to learn Ruby with an understand of how things are implemented.

In my previous post[1], I go into why I've always felt I didn't need Ruby since I knew Python, and I spent time learning Rust instead. It felt redundant to learn a second dynamically typed programming langauge that offered no advantage in performance. I started working at Chatwoot, where we use Ruby, and I had to pick up Ruby for the job. I didn't want to be satisfied with a "user-level" knowledge of the language and instead wanted to rip its internals apart so I can learn why it does the things it does.

Call it a preference on how I want to learn things.

[1] - https://tech.stonecharioteer.com/posts/2025/ruby/

Dynamic types in Swift do use message passing. Int/NSInteger is a struct/value type, but NSNumber is a dynamic type that would receive a message.