Professional Web Applications Themes

instance_eval and constants - Ruby

Hello, I think this used to work in the past, but isn't working with recent Ruby versions (since sometime in the 1.6.x stream): class MyClass SomeConstant = 1 def MyClass.block(&block) instance_eval(&block) end end MyClass.block { puts SomeConstant } Now it says: NameError: uninitialized constant SomeConstant In order to make it work, I have to define: class MyClass def MyClass.method_missing(name) constant = name.to_s constant = constant[0..0].upcase + constant[1..-1] eval constant end end Then I can effectively use lower-case accessor functions for the constants: MyClass.block { puts someConstant } Is it possible to make it work without this crutch? Thanks, Aron...

  1. #1

    Default instance_eval and constants

    Hello,

    I think this used to work in the past, but isn't working with recent
    Ruby versions (since sometime in the 1.6.x stream):

    class MyClass
    SomeConstant = 1
    def MyClass.block(&block)
    instance_eval(&block)
    end
    end

    MyClass.block { puts SomeConstant }

    Now it says:

    NameError: uninitialized constant SomeConstant

    In order to make it work, I have to define:

    class MyClass
    def MyClass.method_missing(name)
    constant = name.to_s
    constant = constant[0..0].upcase + constant[1..-1]
    eval constant
    end
    end

    Then I can effectively use lower-case accessor functions for the
    constants:

    MyClass.block { puts someConstant }

    Is it possible to make it work without this crutch?

    Thanks,
    Aron


    Aron Guest

  2. #2

    Default Re: instance_eval and constants

    Aron Griffis wrote: 

    MyClass.block { puts self::SomeConstant }

    That overrides the static scoping, at least in the current 1.9.0. But I
    don't know what's going to happen in the future.


    Joel Guest

  3. #3

    Default Re: instance_eval and constants

    Joel VanderWerf wrote: [Tue Feb 24 2004, 05:50:04PM EST] 

    Sure, but that obviates the point of the code, doesn't it? In that case
    I could have just used MyClass::SomeConstant. The point of
    MyClass.block was to expose the constant names for ease of use.

    The thing I don't understand is... why are method names exposed to the
    namespace with instance_eval but constant names are not?

    Aron


    Aron Guest

Similar Threads

  1. ASP Constants
    By Jack in forum ASP Database
    Replies: 3
    Last Post: October 21st, 01:20 AM
  2. Using Constants
    By Shawn McKenzie in forum PHP Development
    Replies: 0
    Last Post: August 11th, 07:42 PM
  3. Replies: 2
    Last Post: August 6th, 01:41 PM
  4. instance_eval and Class Variables
    By Tim Bates in forum Ruby
    Replies: 0
    Last Post: August 6th, 06:05 AM
  5. instance_eval("class") error/bug???
    By walter@mwsewall.com in forum Ruby
    Replies: 2
    Last Post: July 17th, 05:29 PM

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •  

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139