[#390749] Why are there so many similar/identical methods in core classes — Kassym Dorsel <k.dorsel@...>

Let's look at the Array class and start with method aliases.

14 messages 2011/12/02

[#390755] Inverse Operation of Module#include — Su Zhang <su.comp.lang.ruby@...>

Hi list,

21 messages 2011/12/02
[#390759] Re: Inverse Operation of Module#include — Ryan Davis <ryand-ruby@...> 2011/12/02

[#390764] Re: Inverse Operation of Module#include — Isaac Sanders <isaacbfsanders@...> 2011/12/02

I would suggest an Adapter pattern use here. IF there is something that has

[#390795] Is there a better way to check this array? — Wayne Brissette <wbrisett@...>

I have an array which contains items that need to be renamed. Unfortunately the way things are changed are based on a comparison of if something else exists. For example in this simple array:

9 messages 2011/12/03

[#390876] black magical hash element vivification — Chad Perrin <code@...>

Ruby (1.9.3p0 to be precise, installed with RVM) is not behaving as I

12 messages 2011/12/05

[#390918] WEB SURVEY about Ruby Community — Intransition <transfire@...>

Did any one else get this survey request?

14 messages 2011/12/07

[#390972] Which is the best online document conversion site? — "Maria M." <mariamoore952@...>

Can anyone tell me that which is the best online document conversion

7 messages 2011/12/08

[#390976] Confusing results from string multiplication — Rob Marshall <robmarshall@...>

Hi,

19 messages 2011/12/08

[#391019] How can I do h["foo"] += "bar" if h["foo"] does not exist? — "Andrew S." <andrewinfosec@...>

Hi there,

13 messages 2011/12/09

[#391027] reading from file without end-of-lines — Janko Muzykant <umrzykus@...>

hi,

20 messages 2011/12/09
[#391028] Re: reading from file without end-of-lines — Gavin Sinclair <gsinclair@...> 2011/12/09

> i'm trying to read a few text values from single file:

[#391031] Re: reading from file without end-of-lines — Robert Klemme <shortcutter@...> 2011/12/09

On Fri, Dec 9, 2011 at 9:58 AM, Gavin Sinclair <gsinclair@gmail.com> wrote:

[#391042] Re: reading from file without end-of-lines — Gavin Sinclair <gsinclair@...> 2011/12/09

On Fri, Dec 9, 2011 at 8:18 PM, Robert Klemme

[#391135] I need advice on what to do next. — Nathan Kossaeth <system_freak_2004@...>

I am new to programming. I read the ebook "Learn to Program" by Chris

23 messages 2011/12/12

[#391216] perf optimization using profile results — Chuck Remes <cremes.devlist@...>

I need some help with optimizing a set of libraries that I use. They are ffi-rzmq, zmqmachine and rzmq_brokers (all up on github).

13 messages 2011/12/13
[#391218] Re: perf optimization using profile results — Chuck Remes <cremes.devlist@...> 2011/12/13

On Dec 13, 2011, at 9:57 AM, Chuck Remes wrote:

[#391234] Re: perf optimization using profile results — Charles Oliver Nutter <headius@...> 2011/12/14

A couple quick observations.

[#391238] Re: perf optimization using profile results — Chuck Remes <cremes.devlist@...> 2011/12/14

On Dec 13, 2011, at 7:03 PM, Charles Oliver Nutter wrote:

[#391324] ruby 1.9 threading performance goes non-linear — Joel VanderWerf <joelvanderwerf@...>

12 messages 2011/12/16
[#391325] Re: ruby 1.9 threading performance goes non-linear — Eric Wong <normalperson@...> 2011/12/16

Joel VanderWerf <joelvanderwerf@gmail.com> wrote:

[#391420] Accessing class instance variables from an instance? — "Shareef J." <shareef@...>

Hi there,

26 messages 2011/12/20
[#391454] Re: Accessing class instance variables from an instance? — Khat Harr <myphatproxy@...> 2011/12/21

Actually, now that I'm thinking about it the existing behavior sort of

[#391456] Re: Accessing class instance variables from an instance? — Josh Cheek <josh.cheek@...> 2011/12/21

On Tue, Dec 20, 2011 at 9:42 PM, Khat Harr <myphatproxy@hotmail.com> wrote:

[#391545] Kernel#exit raises an exception? — Khat Harr <myphatproxy@...>

While I was working on embedding an interpreter I wrote a function to

13 messages 2011/12/24

[#391618] rvmsh: An easy installer for RVM — Bryan Dunsmore <dunsmoreb@...>

I have recently begun work on a project called [rvmsh]

12 messages 2011/12/29

[#391783] Mailspam — Gunther Diemant <g.diemant@...>

Is there a way to stop this mailspam of Luca (Mail)?

12 messages 2011/12/29

[#391790] What’s the standard way of implementing #hash for value objects in Ruby? — Nikolai Weibull <now@...>

Hi!

23 messages 2011/12/29
[#391792] Re: What’s the standard way of implementing #hash for value objects in Ruby? — Gunther Diemant <g.diemant@...> 2011/12/29

I think you can't access instance variables from a class method, so

[#391793] Re: What’s the standard way of implementing #hash for value objects in Ruby? — Nikolai Weibull <now@...> 2011/12/29

On Thu, Dec 29, 2011 at 15:52, Gunther Diemant <g.diemant@gmx.net> wrote:

[#391811] Re: What’s the standard way of implementing #hash for value objects in Ruby? — Robert Klemme <shortcutter@...> 2011/12/29

On Thu, Dec 29, 2011 at 4:06 PM, Nikolai Weibull <now@bitwi.se> wrote:

[#391812] Re: What’s the standard way of implementing #hash for value objects in Ruby? — Nikolai Weibull <now@...> 2011/12/29

On Fri, Dec 30, 2011 at 00:26, Robert Klemme <shortcutter@googlemail.com> wrote:

[#391816] Re: What’s the standard way of implementing #hash for value objects in Ruby? — Josh Cheek <josh.cheek@...> 2011/12/30

On Thu, Dec 29, 2011 at 5:47 PM, Nikolai Weibull <now@bitwi.se> wrote:

[#391833] Re: What’s the standard way of implementing #hash for value objects in Ruby? — Robert Klemme <shortcutter@...> 2011/12/30

On Fri, Dec 30, 2011 at 12:47 AM, Nikolai Weibull <now@bitwi.se> wrote:

Re: Hash access

From: Josh Cheek <josh.cheek@...>
Date: 2011-12-30 08:59:38 UTC
List: ruby-talk #391820
On Fri, Dec 30, 2011 at 1:41 AM, Yong Li <gilbertly@gmail.com> wrote:

> Hi Josh,
>
> Here is how Hash in Ruby works when it tries to determine if two keys are
> equal:
> * the #hash method on both objects are called to calculate their hash codes
> * if their hash codes are not equal, they are not equal
> * if their hash codes are equal, then #== is called to determine if
> two objects are equal
>
> In your example, all three objects actually return the same hash
> codes, so #== (instead of eql?) is used to check their equality.
>
> The "first Josh" and the "second Josh" are equal because their #==
> (inherited from Object#==) simply calls #eql? which you have
> overridden to make them equal.
>
> The "first Josh" is not equal to "Josh" because they are of different
> classes, and User#== (inherited from Object#==) does not allow objects
> of different classes to be equal.
>
> As a side note: you should always define #hash and #== together and
> make sure whenever #== returns true #hash mush return the same number,
> otherwise, using these objects as hash keys will break the hash
> semantics. Also, avoid using mutable objects as hash keys unless their
> #hash number is immutable.
>
> I hope this helps
>
>
> On Fri, Dec 30, 2011 at 1:37 PM, Josh Cheek <josh.cheek@gmail.com> wrote:
> > Hi, was playing around with an idea after reading the thread about
> defining
> > #hash. My understanding was that #hash gives a unique identifier, and
> that
> > #eql? allows the hash to determine whether the two objects are equal in
> > terms of being the same hash key. So I wrote some code that should take
> an
> > equivalent instance, or a string for quick access. But it behaves in a
> way
> > that I completely don't understand. Hoping someone can help:
> >
> >
> > User = Struct.new :name, :age, :identifier do
> >  def hash
> >    name.hash
> >  end
> >
> >  def eql?(other)
> >    puts "#{name} was asked if they were equal to #{other.inspect}"
> >    (other == name) || (other.name == name && other.age == age)
> >  end
> > end
> >
> > josh = User.new 'Josh', 28, 'first Josh'
> > hash = {josh => josh}
> >
> > hash[josh]                                # => #<struct User name="Josh",
> > age=28, identifier="first Josh">
> > hash[User.new 'Josh', 28, 'second Josh']  # => #<struct User name="Josh",
> > age=28, identifier="first Josh">
> > hash['Josh']                              # => nil
> >
> > # >> Josh was asked if they were equal to #<struct User name="Josh",
> > age=28, identifier="first Josh">
> >
> >
> >
> > So I would have expected all three to go through eql? Instead, we see
> that
> > only the case where the key was the same object goes through. However, it
> > identifies that the second Josh is the same key, without invoking
> User#eql?
> > How does it do this?
> >
> > And why does the string "Josh" not find the instance?
> >
> > This is all probably in my copy of the Pickaxe, but it's in Chicago and
> I'm
> > out of town :/
>
>
I see. The confusion for me was that the comparison goes in the other
direction. (ie hash["Josh"] turns into "Josh".eql?(#<struct User ...>) but
I was thinking it would be #<struct User ...>.eql?("Josh")). This becomes
apparent if I change the log line to `puts "#{inspect} was asked if they
were #eql? to #{other.inspect}"` I just didn't do that in the name of
brevity, and it masked the discrepancy.

So it's probably implemented something like this (ignoring nuances like
collisions and default values)

# expectation
class Hash
  def [](key)
    potential_key, potential_value = at_hash key.hash
    return potential_value if potential_key.eql? key
  end
end


# actual
class Hash
  def [](key)
    potential_key, potential_value = at_hash key.hash
    return potential_value if key.equal? potential_key
    return potential_value if key.eql? potential_key
  end
end

In This Thread