Project

General

Profile

Actions

Bug #17649

closed

`defined?` invokes method once for each syntactic element around it

Added by josh.cheek (Josh Cheek) about 3 years ago. Updated about 3 years ago.

Status:
Closed
Assignee:
-
Target version:
-
ruby -v:
ruby 3.0.0p0 (2020-12-25 revision 95aff21468) [x86_64-darwin20]
[ruby-core:<unknown>]

Description

Honestly, I was surprised defined? works with expressions at all. I wouldn't object to this feature being removed, it leads to strange situations where it invokes methods, like below, and silently returns wrong results, if any of the methods raise. But, given that it is implemented this way, it should probably not be invoking methods multiple times like this.

public def x
  $times_called += 1
end

def times_called
  $times_called = 0
  yield
  $times_called
end

# without `defined?`
times_called { x }           # => 1
times_called { -x }          # => 1
times_called { --x }         # => 1
times_called { ---x }        # => 1
times_called { x+0+0 }       # => 1
times_called { x.pred.pred } # => 1
times_called { x.x.x.x.x.x } # => 6

# with `defined?`
times_called { defined? x }           # => 0
times_called { defined? -x }          # => 1
times_called { defined? --x }         # => 2
times_called { defined? ---x }        # => 3
times_called { defined? x+0+0 }       # => 2
times_called { defined? x.pred.pred } # => 2
times_called { defined? x.x.x.x.x.x } # => 15

Related issues 1 (0 open1 closed)

Related to Ruby master - Bug #13708: catastrophic slow compilation of defined-defined sequence has no chance to ^CClosedActions
Actions

Also available in: Atom PDF

Like0
Like0Like0Like0Like0Like0