Issue #20043 has been updated by tenderlovemaking (Aaron Patterson).
File general - ruby-lang - 4 new items - Slack 2023-12-19 16-10-39.png added
ko1 (Koichi Sasada) wrote in #note-3:
It seems a bug from Ruby 2.2.
![](clipboard-202312191405-owvpy.png)
I think `itself` was added in Ruby 2.2. Seems this bug is perhaps from Ruby 1.9?
![](general%20-%20ruby-lang%20-%204%20new%20items%20-%20Slack%202023-12-19%2016-10-39.png)
Dan0042 (Daniel DeLorme) wrote in #note-4:
I didn't know about this way of using `defined?`
and it's interesting to me that we can check if multiple things are defined at once.
Yes, I thought so too. I can understand the utility of `defined?([x, y, z])`, but I
can't tell if that was intended? Especially considering the `x && y &&
z` case.
Also `defined?([x, y, z])` will return "expression" if x, y, and z are defined.
But `[x, y, z]` seems like an expression regardless of whether or not those are defined
(the expression just might raise though).
----------------------------------------
Bug #20043: `defined?` checks for method existence but only sometimes
https://bugs.ruby-lang.org/issues/20043#change-105744
* Author: tenderlovemaking (Aaron Patterson)
* Status: Open
* Priority: Normal
* ruby -v: ruby 3.3.0dev (2023-12-05T21:25:34Z master 56eccb350b) [arm64-darwin23]
* Backport: 3.0: UNKNOWN, 3.1: UNKNOWN, 3.2: UNKNOWN
----------------------------------------
When an expression is passed to `defined?`, it will _sometimes_ check if a method in a
sub-expression is defined and sometimes it won't.
For example:
```
$ ./miniruby -e'p defined?(a)'
nil
$ ./miniruby -e'p defined?([a])'
nil
```
In the above case, Ruby will check whether or not the method `a` is defined, and it
returns `nil`. However, if you use a splat, it will not check:
```
$ ./miniruby -e'p defined?([*a])'
"expression"
```
The same thing seems to happen with method parameters:
```
$ ./miniruby -e'p defined?(itself)'
"method"
$ ./miniruby -e'p defined?(itself(a))'
nil
$ ./miniruby -e'p defined?(itself(*a))'
"method"
```
Oddly, `defined?` will check contents of arrays, but _won't_ check contents of
hashes:
```
$ ./miniruby -e'p defined?([[[[a]]]])'
nil
$ ./miniruby -e'p defined?({ a => a })'
"expression"
```
I think all of the cases that refer to `a` should check whether or not `a` is defined
regardless of splats or hashes.
---Files--------------------------------
clipboard-202312191405-owvpy.png (27.3 KB)
general - ruby-lang - 4 new items - Slack 2023-12-19 16-10-39.png (100 KB)
--
https://bugs.ruby-lang.org/