[#398788] Constructor or a Method — Rubyist Rohit <lists@...>

Take for instance this code:

13 messages 2012/09/01

[#398896] how to sum element of array — Edward QU <lists@...>

dear all

19 messages 2012/09/04

[#398936] best coding for limiting a value — Regis d'Aubarede <lists@...>

A) result=value<min ? min : (value > max ? max : value)

17 messages 2012/09/04

[#398962] Long calculation & time limit — toto tartemolle <lists@...>

Hello,

17 messages 2012/09/05

[#398964] Compiling ruby from source on windows — GPad <peterpan105105@...>

Hi to all,=0AI'm trying to compile ruby on my windows 7. I have already a r=

10 messages 2012/09/05

[#398997] OpenURI open method problem — "Derek T." <lists@...>

The code I am referring to looks like this:

12 messages 2012/09/05

[#399002] Parsing through downloaded html — Sybren Kooistra <lists@...>

Hi all,

28 messages 2012/09/06

[#399012] "Hiding" pictures(and source code if it's possible) — "Damián M. González" <lists@...>

Ey guys, how are you?

11 messages 2012/09/06

[#399083] regix in grep or something like this — Ferdous ara <lists@...>

Hi

12 messages 2012/09/07

[#399206] please help me with making script — Charmaine Willemsen <lists@...>

In this example i like to parse birthday and sexe

11 messages 2012/09/11

[#399218] Pathname#to_str withdrawn in 1.9? — matt@... (Matt Neuburg)

Just getting started experimenting with Ruby 1.9 (1.9.3) and my scripts

13 messages 2012/09/12

[#399227] Breaking Down the Block — incag neato <lists@...>

Can someone please explain in plain english how this block treats the

20 messages 2012/09/13

[#399244] ruby Range to array that acts like time objects? — "Jermaine O." <lists@...>

Hello everybody,

15 messages 2012/09/13

[#399293] Ruby on Ubuntu 12.04 LST — Bojan Jordanovski <lists@...>

Hello everybody,

13 messages 2012/09/14

[#399298] wow, YAML / Psych in 1.9.3 is *slow*! — matt@... (Matt Neuburg)

I just started trying Ruby 1.9.3, coming from Ruby 1.8.7, and was

12 messages 2012/09/14

[#399304] Ruby 1.9.3 and OS X Mountain Lion — sto.mar@...

Hi all,

16 messages 2012/09/14

[#399343] Class variables or Class singleton variables? — "Damián M. González" <lists@...>

Guys, how are you?

18 messages 2012/09/15

[#399386] Ruby - is it worth the effort? — neomex <neomex@...>

Hello,

19 messages 2012/09/17
[#399406] Re: Ruby - is it worth the effort? — Roger Pack <lists@...> 2012/09/17

Unfortunately with Ruby for me it's typically "fun and fast development"

[#399409] Re: Ruby - is it worth the effort? — Peter Zotov <whitequark@...> 2012/09/17

Roger Pack писал 17.09.2012 22:06:

[#399491] Re: Ruby - is it worth the effort? — Robert Klemme <shortcutter@...> 2012/09/19

On Mon, Sep 17, 2012 at 8:20 PM, Peter Zotov <whitequark@whitequark.org> wr=

[#399421] Encoding question — Thomas Bednarz <lists@...>

I am new to ruby and play around with it a little bit at the moment. I

17 messages 2012/09/17

[#399441] Bug or feature — Damjan Rems <lists@...>

There has probably been some discussion about this problem so sorry if I

13 messages 2012/09/18

[#399451] Class variables — Aleksander Ciesielski <neomex@...>

Is it obligatory to use instance variables in classes? Can't we just

17 messages 2012/09/18

[#399479] Ruby SQL Select Sum 2 Columns? — Courtney Fay <lists@...>

I have the following definition which is looking at an apache database,

12 messages 2012/09/18

[#399556] still learning by doing - connecting rooms in a game — "Sebastjan H." <lists@...>

Hi,

28 messages 2012/09/20
[#399570] Re: still learning by doing - connecting rooms in a game — Henry Maddocks <hmaddocks@...> 2012/09/20

[#399574] Re: still learning by doing - connecting rooms in a game — "Sebastjan H." <lists@...> 2012/09/21

Henry Maddocks wrote in post #1076876:

[#399575] Re: still learning by doing - connecting rooms in a game — Henry Maddocks <hmaddocks@...> 2012/09/21

[#399576] Re: still learning by doing - connecting rooms in a game — "Sebastjan H." <lists@...> 2012/09/21

Could you be so kind as to suggest another book? I mean there are many

[#399585] Re: still learning by doing - connecting rooms in a game — "Sebastjan H." <lists@...> 2012/09/21

Sebastjan H. wrote in post #1076909:

[#399572] How would you allow variable from specific list of Fixnum? — Eliezer Croitoru <eliezer@...>

I have:

11 messages 2012/09/21

[#399623] Very important question - survey — Marc Heiler <lists@...>

Is matz more like a ninja or more like a samurai?

11 messages 2012/09/22

[#399695] inject problem — Roelof Wobben <rwobben@...>

26 messages 2012/09/25

[#399714] could initialize return an existing object instead of a new instance? — Gary Weaver <lists@...>

Is it possible for initialize to return an existing object instead of a

9 messages 2012/09/25

[#399811] Good book for getting started with Ruby? [I code Python!] — Alec Taylor <alec.taylor6@...>

I've learned programming in C++, Python and PHP at University. (also

12 messages 2012/09/28

[#399815] calcaulation with unknown numbers of numbers and options fail — Roelof Wobben <rwobben@...>

11 messages 2012/09/28

Re: could initialize return an existing object instead of a new instance?

From: Robert Klemme <shortcutter@...>
Date: 2012-09-27 16:39:29 UTC
List: ruby-talk #399802
On Tue, Sep 25, 2012 at 8:13 PM, Gary Weaver <lists@ruby-forum.com> wrote:
> Is it possible for initialize to return an existing object instead of a
> new instance?

First of all, it's totally meaningless what #initialize returns.
Object creation is done inside the class's method #new.  #initialize
is just an instance method which happens to be invoked on a newly
allocated object (that method exists as well).  So basically you can
imagine it to work like this

class Class
  def new(*a, &b)
    x = allocate
    x.send(:initialize, *a, &b)
    x
  end
end

So, yes, you can modify a class's method #new to return anything you like.

Side note, if you implement that method on your own I find this a tad
more elegant:

class Class
  def new(*a, &b)
    allocate.tap {|x| x.send(:initialize, *a, &b)}
  end
end

> Specifically curious about whether it would be possible to implement a
> StringPool in Ruby such that the same object with same object_id would
> be returned if you tried to construct with the same value,

Easy:

string_pool = Hash.new {|h,s| h[s.freeze] = s}

irb(main):002:0> 5.times { puts string_pool["foo"].object_id}
-1072382248
-1072382248
-1072382248
-1072382248
-1072382248
=> 5
irb(main):003:0> 5.times.map { string_pool["foo"].object_id }.uniq
=> [-1072382248]

Note: the call of #freeze is necessary since a Hash will dup a mutable
String key to avoid aliasing effects.  That's a feature of Hash.

> unless a bang
> method (like chomp!) were called on the object in which case instead of
> returning the same object instance from the bang method, it would return
> a different object instance. I told someone that this would be a massive
> change since it would break these two assumptions:

Right.  That'll be difficult since behavior of String instances would
need to be changed if they are in the pool.  Hard to do and probably
not efficient.

> s = "Hello"
> s2 = "Hello"
> # s.object_id != s2.object_id
>
> s = "Hello"
> original_object_id = s.object_id
> s.chomp!('o')
> # original_object_id == s.object_id
>
> But, maybe if it were possible to develop this as a gem, people could
> use at their own risk.
>
> Also, it just seemed like a neat idea (not that it would work in the
> String case?) if you could do something in the initializer to abandon
> the instance that was being created and instead return a different
> object from the initializer, like one that already exists. Even if this
> isn't possible currently, what issues would one run into trying to
> implement support for this? Thanks!

See above, you need to modify your class's #new method.  Silly example:

irb(main):006:0> class George
irb(main):007:1> attr_reader :num
irb(main):008:1> def initialize(x) @num = x.to_int end
irb(main):009:1> end
=> nil
irb(main):010:0> 3.times.map { George.new(1).object_id }
=> [-1072296698, -1072296708, -1072296718]
irb(main):011:0> 3.times.map { George.new(1).object_id }.uniq
=> [-1072308808, -1072308818, -1072308828]

OK, regular case: we get a new George for every int.  Now we create the pool:

irb(main):013:0> class <<George
irb(main):014:1> alias _new new
irb(main):015:1> def new(x)
irb(main):016:2> @objects[x.to_int] ||= _new(x)
irb(main):017:2> end
irb(main):018:1> end
=> nil

Create the Array which is the pool:

irb(main):019:0> class George
irb(main):020:1> @objects=[]
irb(main):021:1> end
=> []

Now let's see:

irb(main):022:0> 3.times.map { George.new(1).object_id }
=> [-1072359978, -1072359978, -1072359978]
irb(main):023:0> 3.times.map { George.new(1).object_id }.uniq
=> [-1072359978]

Ah!

Note: all sorts of issues have to be considered which might be
introduced by this, i.e. memory leaks, concurrency issues etc.  This
approach works best for immutable objects of course.  Even then the
pool needs to be properly synchronized.

Kind regards

robert

-- 
remember.guy do |as, often| as.you_can - without end
http://blog.rubybestpractices.com/

In This Thread