[#20675] RCR: non-bang equivalent to []= — Tobias Reif <tobiasreif@...>

Hi,

49 messages 2001/09/01
[#20774] Re: RCR: non-bang equivalent to []= — Tobias Reif <tobiasreif@...> 2001/09/03

I wrote:

[#20778] Re: RCR: non-bang equivalent to []= — Kevin Smith <kevinbsmith@...> 2001/09/03

--- Tobias Reif <tobiasreif@pinkjuice.com> wrote:

[#20715] oreilly buch von matz - website online — markus jais <info@...>

hi

43 messages 2001/09/02
[#20717] Re: OReilly Ruby book has snail on cover — ptkwt@...1.aracnet.com (Phil Tomson) 2001/09/02

Actually, thanks for posting it here. I was trying to search OReilly's

[#20922] Re: OReilly Ruby book has snail on cover — Paul Brannan <pbrannan@...> 2001/09/05

On Mon, 3 Sep 2001, Phil Tomson wrote:

[#20768] Minor cgi.rb question — "Hal E. Fulton" <hal9000@...>

I don't have much experience with

25 messages 2001/09/03

[#20770] Calling member methods from C++ — jglueck@... (Bernhard Glk)

Some quetsions have been solved for me, but my message system does not

12 messages 2001/09/03

[#20976] destructor — Frank Sonnemans <ruby@...>

Does Ruby have a destructor as in C++?

25 messages 2001/09/07

[#21218] Ruby objects <-> XML: anyone working on this? — senderista@... (Tobin Baker)

Are there any Ruby analogs of these two Python modules (xml_pickle,

13 messages 2001/09/15

[#21296] nested require files need path internally — Bob Gustafson <bobgus@...>

Version: 1.64

29 messages 2001/09/18
[#21298] Re: nested require files need path internally — David Alan Black <dblack@...> 2001/09/18

Hello --

[#21302] Re: nested require files need path internally — Bob Gustafson <bobgus@...> 2001/09/18

On Tue, 18 Sep 2001, David Alan Black wrote:

[#21303] Re: nested require files need path internally — matz@... (Yukihiro Matsumoto) 2001/09/18

Hi,

[#21306] Re: nested require files need path internally — Lars Christensen <larsch@...> 2001/09/18

On Tue, 18 Sep 2001, Yukihiro Matsumoto wrote:

[#21307] Re: nested require files need path internally — matz@... (Yukihiro Matsumoto) 2001/09/18

Hi,

[#21331] Re: nested require files need path internally — Paul Brannan <pbrannan@...> 2001/09/18

> The big difference is C++ search done in compile time, Ruby search

[#21340] Re: nested require files need path internally — matz@... (Yukihiro Matsumoto) 2001/09/18

Hi,

[#21353] Re: nested require files need path internally — Paul Brannan <pbrannan@...> 2001/09/18

On Wed, 19 Sep 2001, Yukihiro Matsumoto wrote:

[#21366] Re: nested require files need path internally — matz@... (Yukihiro Matsumoto) 2001/09/19

Hi,

[#21368] Re: nested require files need path internally — "Julian Fitzell" <julian-ml@...4.com> 2001/09/19

On 19/09/2001 at 10:12 AM matz@ruby-lang.org wrote:

[#21376] Re: nested require files need path internally — matz@... (Yukihiro Matsumoto) 2001/09/19

Hi,

[#21406] Re: nested require files need path internally — Paul Brannan <pbrannan@...> 2001/09/19

On Wed, 19 Sep 2001, Yukihiro Matsumoto wrote:

[#21315] Suggestions for new CGI lib — anders@... (Anders Johannsen)

From the comp.lang.ruby thread "Minor cgi.rb question" (2001-09-03), I

21 messages 2001/09/18

[#21413] Ruby/objects book in style of The Little Lisper — Brian Marick <marick@...>

I fell in love with Lisp in the early 80's. Back then, I read a book called

36 messages 2001/09/19
[#21420] Re: Ruby/objects book in style of The Little Lisper — Christopher Sawtell <csawtell@...> 2001/09/20

On 20 Sep 2001 06:19:44 +0900, Brian Marick wrote:

[#21479] Re: Ruby/objects book in style of The Little Lisper — Kevin Smith <kevinbsmith@...> 2001/09/21

--- Christopher Sawtell <csawtell@paradise.net.nz> wrote:

[#21491] SV: Re: Ruby/objects book in style of The Little Lisper — "Mikkel Damsgaard" <mikkel_damsgaard@...> 2001/09/21

[#21494] Re: SV: Re: Ruby/objects book in style of The Little Lisper — Kevin Smith <kevinbsmith@...> 2001/09/21

--- Mikkel Damsgaard <mikkel_damsgaard@mailme.dk> wrote:

[#21510] Re: SV: Re: Ruby/objects book in style of The Little Lisper — Todd Gillespie <toddg@...> 2001/09/22

On Sat, 22 Sep 2001, Kevin Smith wrote:

[#21514] Re: SV: Re: Ruby/objects book in style of The Little Lisper — Kevin Smith <kevinbsmith@...> 2001/09/22

--- Todd Gillespie <toddg@mail.ma.utexas.edu> wrote:

[#21535] irb — Fabio <fabio.spelta@...>

Hello. :) I'm new here, and I have not found an archive of the previous

15 messages 2001/09/22

[#21616] opening a named pipe? — "Avdi B. Grimm" <avdi@...>

I'm having trouble reading from a named pipe in linux. basicly, I'm

12 messages 2001/09/24

[#21685] manipulating "immutable" objects such as Fixnum from within callbacks & al... — Guillaume Cottenceau <gc@...>

Hello,

15 messages 2001/09/25

[#21798] Ruby internal (guide to the source) — "Benoit Cerrina" <benoit.cerrina@...>

Hi,

22 messages 2001/09/28

[ruby-talk:21701] strange behaviors

From: "Avdi B. Grimm" <avdi@...>
Date: 2001-09-26 00:00:19 UTC
List: ruby-talk #21701
Hello,

In the process of a frighteningly productive spate of Ruby coding
today, I ran across some seeming quirks in the language.  I'm curious
whether these are bugs, features, known eccentricities, or what, so I
thought I'd post them and see if anyone else is familiar with the
behaviors I encountered.

Quirk #1: Inconsistent name resolution in instance methods

Ruby looks up unqualified names it finds in method bodies in the
method list of 'self' - usually.

For example:

class Foo
  def bar
    @bar
  end

  def bar=(val)
    @bar = val
  end
  
  def implicit_fetch
    bar # Ruby interprets this as Foo#bar, defined above.
  end
end

f = Foo.new
f.bar = "test 1 2 3"
puts f.implicit_fetch 


This yields the expected response:

test 1 2 3

Ruby correctly interprets the bare reference to 'bar' as a call to
Foo.bar. However, this behavior doesn't hold true for 'setter'
methods. If I expand the class above thus:

class Foo
  def bar
    @bar
  end
  
  def bar=(val)
    @bar = val
  end

  def implicit_assign
    bar = "implicitly assigned" # doesn't call bar=()
  end

  def explicit_assign
    self.bar = "explicitly assigned"
  end

  def implicit_fetch
    bar
  end
end


and then I exercise it:

    f = Foo.new
    f.implicit_assign		# fails
    puts f.implicit_fetch
    f.explicit_assign		# works
    puts f.implicit_fetch

I get the following output:

nil
explicitly assigned

As far as I can tell, ruby is interpreting the
line 

     bar = "implicitly assigned"

to mean "assign the string on the right to a local variable named
'bar'". Unlike for the 'getter' method, Ruby doesn't interpret "bar ="
to mean "call the method of self named bar=()". This despite the fact
that calling "f.bar = some_string" /outside/ the class would result in
a call to bar=().  This was startling inconsistency at first; but
as you can see it's easily gotten around by explicitly referencing
"self.bar =" inside a method that wants to call bar=().

However, that's not the end of the story.  While slightly more
cumbersome, the workaround above works fine - for public or protected
attributes. But what about private 'setter' methods?  Private methods
*can't* be explicitly referenced via "self.method_name"; that's what
makes them private. So if I modify the above class to privatize
bar=(), I find that there's no way at all (that I know of) to access
it:

class Foo
  def bar
    @bar
  end
  
  def bar=(val)
    @bar = val
  end
  
  private :bar=

  def implicit_assign
    bar = "implicitly assigned"
  end

  def explicit_assign
    self.bar = "explicitly assigned"
  end

  def implicit_fetch
    bar
  end
end

f = Foo.new
f.implicit_assign
puts f.implicit_fetch
f.explicit_assign
puts f.implicit_fetch


the above code yields the error:

-:19:in `explicit_assign': private method `bar=' called for
#<Foo:0x4025e310> (NameError)
	from -:31
nil

So, as far as I can tell, private setter methods are completely
inaccessible. This seems sub-optimal, but maybe I'm missing something.


Quirk #2: Constants aren't dynamically resolved

Apparently, each class gets it's own private copy of constants defined
within it, unlike class variables which are shared between parent and
child classes. This useful feature is demonstrated with the following
code:

class Parent
  CONSTANT = "foo"

class Child < Parent
  CONSTANT = "bar"
end

puts Parent::CONSTANT # prints "foo"
puts Child::CONSTANT  # prints "bar"

So far, so good. However, when I assume that Ruby will dynamically
figure out which constant to use based on the class of self, I run
into trouble. E.g.:

class Parent
  CONSTANT = "foo"

  def Parent.implicit
    CONSTANT          # always resolves to Parent::CONSTANT
  end

  def Parent.explicit
    self::CONSTANT    # resolves dynamically
  end
end

class Child < Parent
  CONSTANT = "bar"
end


class Parent
  CONSTANT = "foo"

  def Parent.implicit
    CONSTANT
  end

  def Parent.explicit
    self::CONSTANT
  end
end

class Child < Parent
  CONSTANT = "bar"
end

puts Child.implicit # prints "foo"
puts Child.explicit # prints "bar"


The implicit internal reference to CONSTANT always yields the value of
CONSTANT for the class in which the current method was defined.  To
get the value of CONSTANT for the current class, I must explicitly ask
for it with self::CONSTANT.

Again, this is just a minor annoyance; but it seems to go against the
Principle of Least Surprise.


Anyone have any comments on either of these two quirks?

- Avdi Grimm





In This Thread

Prev Next