[#407882] Ruby extremely slow compared to PHP — Mick Jagger <lists@...>

Hello there, how are you? Hope you are fine. I am a PHP programmer

17 messages 2013/06/02

[#407908] TCPServer/Socket and Marshal problem — Panagiotis Atmatzidis <atma@...>

Hello,

18 messages 2013/06/03

[#407946] Is rubyquiz.com dead? — Alphonse 23 <lists@...>

Thread title says everything.

18 messages 2013/06/04

[#408012] Need help understanding recursion. — pedro oliva <lists@...>

Ive been reading Chris Pine's book 'Learn to Program' and its been going

11 messages 2013/06/06

[#408129] Getting Started With Development — Chamila Wijayarathna <cdwijayarathna@...>

I'm new to Ruby Development. I downloaded source from Github, but couldn't

24 messages 2013/06/11
[#408131] Re: Getting Started With Development — Per-erik Martin <lists@...> 2013/06/11

Ruby is often installed on linux, or can be easily installed with the

[#408146] Re: Getting Started With Development — "Chamila W." <lists@...> 2013/06/11

Per-erik Martin wrote in post #1112021:

[#408149] Re: Getting Started With Development — "Carlo E. Prelz" <fluido@...> 2013/06/11

Subject: Re: Getting Started With Development

[#408198] NokoGiri XML Parser — "Devender P." <lists@...>

Hi,

11 messages 2013/06/13

[#408201] trying to load a .rb file in irb — "Eric D." <lists@...>

I am trying to load a ruby program into irb and it will not load.

12 messages 2013/06/13

[#408205] Can I use Sinatra to render dynamic pages? — Ruby Student <ruby.student@...>

Hell Team,

18 messages 2013/06/13
[#408219] Re: Can I use Sinatra to render dynamic pages? — Nicholas Van Weerdenburg <vanweerd@...> 2013/06/14

You should be able to do this without JavaScript by using streaming.

[#408228] Re: Can I use Sinatra to render dynamic pages? — Ruby Student <ruby.student@...> 2013/06/14

Well, I got some good suggestions from everyone here. I thank you all for

[#408275] Compare and sort one array according to another. — masta Blasta <lists@...>

I have two arrays of objects that look something like this:

14 messages 2013/06/17

[#408276] Comparing objects — "Thom T." <lists@...>

How do I compare two objects in Ruby, considering only attributes

15 messages 2013/06/17

[#408307] getting the most out of Ruby — robin wood <lists@...>

I write a lot of scripts in Ruby, most are small simple things but some

13 messages 2013/06/18

[#408309] Creating ruby script exe — Rochit Sen <lists@...>

Hi All,

17 messages 2013/06/18

[#408357] Beginners problem with database and datamapper — cristian cristian <lists@...>

Hi all!

28 messages 2013/06/20

[#408437] How do I input a variable floating point number into Ruby Programs — "Michael P F." <lists@...>

I want to evaluate the following interactively:

10 messages 2013/06/23

[#408518] #!/usr/bin/env: No such file or directory — Todd Sterben <lists@...>

I am new to both linux and ruby. I am using Ubuntu and Ruby 1.9

17 messages 2013/06/27

[#408528] Designing a Cabinet class — Mike Vezzani <lists@...>

Hello all,

12 messages 2013/06/27

[#408561] Find elment in array of hashes — Rodrigo Lueneberg <lists@...>

array = {:id=>1, :price =>0.25} # index[0]

23 messages 2013/06/28

Re: Is it a bug(about constant reference on dynamic class).

From: Gary Wright <gwtmp01@...>
Date: 2013-06-03 02:59:13 UTC
List: ruby-talk #407896
On Jun 1, 2013, at 5:35 PM, jin chizhong <lists@ruby-forum.com> wrote:

> When I use a dynamic class, It can not reference constants.
> See follow code and remark.

The reason is that your two examples have different lexical scopes and constants are resolved lexically.

> class T
>  def hello
>    puts self.class.constants.join " "    # right, AAA
>    puts AAA                              # right, 1
>  end
> end

Here, AAA is lexically within T so ruby searches T::AAA and ::AAA before giving up.

> T::AAA = 1
> t = T.new
> t.hello

You can see this by doing:

class Demo; def get_T; T; end; end
T = 'top'
Demo.new.get_T		# 'top'
Demo::T = 'demo'	# now there is ::T and Demo::T
Demo.new.get_T		# 'demo', because Demo::T is searched before ::T


> c = Class.new do
>  def hello
>    puts self.class.constants.join " "    # right, AAA
>    puts AAA          # error: uninitialized constant AAA (NameError)
>  end
> end

Here AAA is not lexically in a class so ruby *only* searches ::AAA before giving up, which is what you see below when you call inst.hello


> c::AAA = 123
> inst = c.new
> inst.hello

If you continue from this point:

puts c::AAA	# 123
AAA = 456	# set top level AAA
puts c:AAA	# still 123
c.new.hello	# 456 because AAA in hello now finds AAA at the top level scope

I think the key to understanding this is to realize that constant lookup path is established when the code is parsed and not when the code is executed.

You asked if there is a way around this and there sort of is.  If you want to force the lookup to start in a particular module then say it explicitly:

c = Class.new do
 def hello
   puts self.class.constants.join " "    # right, AAA
   puts self.class::AAA                  # forces search to start in c
 end
end

Just to be a bit more complete, ruby also searches the superclasses of any class in the lexical scope:

class A
  def lookup_X
    X                  # X is resolved as A::X, ::X
  end
end

class B < A
  def lookup_X_from_B
    X                  # X is resolved as B::X, A::X, ::X
  end
end

A.new.lookup_X         # A::X, ::X
B.new.lookup_X         # still A::X, ::X even though called on instance of B
B.new.lookup_X_from_B  # B::X, A::X, ::X  

Now try setting X = 1; A::X = 2, and B::X = 3 and see what the lookup methods return.


Gary Wright



In This Thread