Project

General

Profile

Actions

Feature #7414

closed

Now that const_get supports "Foo::Bar" syntax, so should const_defined?.

Added by robertgleeson (Robert Gleeson) over 11 years ago. Updated over 10 years ago.

Status:
Closed
Target version:
[ruby-core:49770]

Description

class Foo
end
Object.const_get "Object::Foo" => Foo
Object.const_defined? "Object::Foo" => NameError (expected true).

Updated by robertgleeson (Robert Gleeson) over 11 years ago

I realise defined? with a constant works just as well but this is about API consistency.
I'd expect const_get & const_defined? to support the same syntax ("Object::Foo").

Updated by mame (Yusuke Endoh) over 11 years ago

  • Status changed from Open to Assigned
  • Assignee set to tenderlovemaking (Aaron Patterson)

Aaron, can you fix it easily?

--
Yusuke Endoh

Updated by sferik (Erik Michaels-Ober) over 11 years ago

I also noticed this inconsistency. It seems very odd to have different behavior for Module#const_get and Module#const_defined?. I hope it's possible to get this change into 2.0.0. It's been a while since I've written any C but I'd be happy to contribute failing specs if that would be helpful.

Updated by benolee (Ben Holley) about 11 years ago

I have been working on a patch, but I have some questions about expected behavior.

In the case when the parent is missing, for example:

# Foo is missing
Object.const_defined?("Foo::Bar")

should it return false? Or raise NameError for "Foo"? Or call Object.const_missing(:Foo)?

Second, in the case when the parent is not a Module or Class, for example:

Foo = Object.new
Object.const_defined?("Foo::Bar")

should it return false? Or raise error "Foo is not a class/module"?

Updated by nobu (Nobuyoshi Nakada) about 11 years ago

I vote for false in both cases, like defined? operator.

Updated by ko1 (Koichi Sasada) about 11 years ago

aaron, could you continue this discussion?

Updated by ko1 (Koichi Sasada) about 11 years ago

  • Target version changed from 2.0.0 to 2.1.0
Actions #8

Updated by nobu (Nobuyoshi Nakada) over 10 years ago

  • Status changed from Assigned to Closed
  • % Done changed from 0 to 100

This issue was solved with changeset r44194.
Robert, thank you for reporting this issue.
Your contribution to Ruby is greatly appreciated.
May Ruby be with you.


object.c: nested path const_defined?

  • object.c (rb_mod_const_defined): support nested class path as
    well as const_get. [Feature #7414]
Actions

Also available in: Atom PDF

Like0
Like0Like0Like0Like0Like0Like0Like0Like0