[#24648] [Bug #1852] Enumerable's #hash Raises ArgumentError When Recursive Values are Present — Run Paint Run Run <redmine@...>

Bug #1852: Enumerable's #hash Raises ArgumentError When Recursive Values are Present

20 messages 2009/08/01
[#24649] Re: [Bug #1852] Enumerable's #hash Raises ArgumentError When Recursive Values are Present — Tanaka Akira <akr@...> 2009/08/01

In article <4a73e51b5a4f9_138119f2a982704e@redmine.ruby-lang.org>,

[#24652] Re: [Bug #1852] Enumerable's #hash Raises ArgumentError When Recursive Values are Present — Run Paint Run Run <runrun@...> 2009/08/01

> Is it valuable to implement such function?

[#24682] Re: [Bug #1852] Enumerable's #hash Raises ArgumentError When Recursive Values are Present — Tanaka Akira <akr@...> 2009/08/02

In article <67e307490908010125r6fa76654pa8e2224f714588fc@mail.gmail.com>,

[#24673] [Feature #1857] install *.h and *.inc — Roger Pack <redmine@...>

Feature #1857: install *.h and *.inc

21 messages 2009/08/01

[#24732] [Bug #1873] MatchData#[]: Omits All But Last Captures Corresponding to the Same Named Group — Run Paint Run Run <redmine@...>

Bug #1873: MatchData#[]: Omits All But Last Captures Corresponding to the Same Named Group

12 messages 2009/08/03

[#24775] [Feature #1889] Teach Onigurma Unicode 5.0 Character Properties — Run Paint Run Run <redmine@...>

Feature #1889: Teach Onigurma Unicode 5.0 Character Properties

30 messages 2009/08/05

[#24786] [Bug #1893] Recursive Enumerable#join is surprising — Jeremy Kemper <redmine@...>

Bug #1893: Recursive Enumerable#join is surprising

24 messages 2009/08/06
[#28422] [Bug #1893] Recursive Enumerable#join is surprising — Yusuke Endoh <redmine@...> 2010/03/02

Issue #1893 has been updated by Yusuke Endoh.

[#28438] Re: [Bug #1893] Recursive Enumerable#join is surprising — Yukihiro Matsumoto <matz@...> 2010/03/03

Hi,

[#24854] embedding ruby 1.9 frustration — Rolando Abarca <funkaster@...>

Hello,

12 messages 2009/08/10

[#24982] [Feature #1961] Kernel#__dir__ — Yutaka HARA <redmine@...>

Feature #1961: Kernel#__dir__

26 messages 2009/08/19
[#28898] [Feature #1961] Kernel#__dir__ — Roger Pack <redmine@...> 2010/03/23

Issue #1961 has been updated by Roger Pack.

[#28900] Re: [Feature #1961] Kernel#__dir__ — Kornelius Kalnbach <murphy@...> 2010/03/23

On 23.03.10 19:10, Roger Pack wrote:

[#25025] [Backport #1975] Backport Dir.mktmpdir — Kirk Haines <redmine@...>

Backport #1975: Backport Dir.mktmpdir

12 messages 2009/08/21

[#25041] Proposal: Simpler block format — Yehuda Katz <wycats@...>

I'd like to propose that we add the following syntax for procs in Ruby:

45 messages 2009/08/23
[#25046] Re: Proposal: Simpler block format — Caleb Clausen <caleb@...> 2009/08/23

Yehuda Katz wrote:

[#25049] Re: Proposal: Simpler block format — Yehuda Katz <wycats@...> 2009/08/23

On Sat, Aug 22, 2009 at 7:38 PM, Caleb Clausen <caleb@inforadical.net>wrote:

[#25058] Re: Proposal: Simpler block format — Yukihiro Matsumoto <matz@...> 2009/08/23

Hi,

[#25059] Re: Proposal: Simpler block format — Yehuda Katz <wycats@...> 2009/08/23

On Sun, Aug 23, 2009 at 3:33 PM, Yukihiro Matsumoto <matz@ruby-lang.org>wrote:

[#25063] Re: Proposal: Simpler block format — "David A. Black" <dblack@...> 2009/08/23

Hi --

[#25068] Re: Proposal: Simpler block format — brian ford <brixen@...> 2009/08/24

Hi,

[#25086] [Bug #1991] ruby should use twolevel namespace on OS X — Michal Suchanek <redmine@...>

Bug #1991: ruby should use twolevel namespace on OS X

12 messages 2009/08/24

[#25208] Module#prepend and Array#prepend — Yehuda Katz <wycats@...>

Matz,

23 messages 2009/08/30

[#25210] [Feature #2022] Patch for ruby-1.8.6 and openssl-1.0 — Jeroen van Meeuwen <redmine@...>

Feature #2022: Patch for ruby-1.8.6 and openssl-1.0

15 messages 2009/08/30

[#25220] [Bug #2026] String encodings are not supported by most of IO on Linux — Vit Ondruch <redmine@...>

Bug #2026: String encodings are not supported by most of IO on Linux

18 messages 2009/08/31

[ruby-core:24773] Re: [Bug #1852] Enumerable's #hash Raises ArgumentError When Recursive Values are Present

From: Tanaka Akira <akr@...>
Date: 2009-08-05 05:33:44 UTC
List: ruby-core #24773
In article <e0b1e5700908042053g2ffecc1dg4ee7df9493f6c480@mail.gmail.com>,
  Yusuke ENDOH <mame@tsg.ne.jp> writes:

> The following program implements a graph with adjacency list by
> using Array and Struct:
>
>   Node = Struct.new(:item, :neighbors)
>   node1 = Node.new(1, [])
>   node2 = Node.new(2, [node1])
>   node1.neighbors << node2

If node2's item is 1, eql? cannot distinguish node1 and
node2 on Ruby 1.9.2.

So, DFS doesn't work well on 1.9.2.

% ./ruby -v -e '
Node = Struct.new(:item, :neighbors)
node1 = Node.new(1, [])
node2 = Node.new(1, [node1])
node1.neighbors << node2
p node1.eql?(node2)
'
ruby 1.9.2dev (2009-08-05 trunk 24405) [i686-linux]
true

> This function worked on 1.8.7 and 1.9.1p243, but not on trunk.

node1.eql?(node2) should be false for DFS.
The program works because it is false on 1.8.7 and 1.9.1.

The program doesn't work reliably on 1.9.2 because eql? is
changed it to return true.  You can notice it with the
exception.

You can use Hash#compare_by_identity to accomplish it on 1.9.

% ./ruby -ve '
Node = Struct.new(:item, :neighbors)
node1 = Node.new(1, [])
node2 = Node.new(1, [node1])
node1.neighbors << node2

def dfs(node, visited = {}, &block)
  return if visited[node]
  yield(node)
  visited[node] = true
  node.neighbors.each {|n| dfs(n, visited, &block) }
end

visited = {}
visited.compare_by_identity

dfs(node1, visited) {|n| p n.item }
'
ruby 1.9.2dev (2009-07-28 trunk 24300) [i686-linux]
1
1

> If hash of recursive structure were a constant, this function
> would work.  Collisions, however, would be terribly frequent.

With Hash#compare_by_identity, DFS works well without
terrible performace problem.

If hashes of node1 and node2 is constant, it doesn't work as
follows.

% ./ruby -ve '
Node = Struct.new(:item, :neighbors)
node1 = Node.new(1, [])
node2 = Node.new(1, [node1])
node1.neighbors << node2

def node1.hash() 0 end
def node2.hash() 0 end

def dfs(node, visited = {}, &block)
  return if visited[node]
  yield(node)
  visited[node] = true
  node.neighbors.each {|n| dfs(n, visited, &block) }
end

dfs(node1) {|n| p n.item }
'
ruby 1.9.2dev (2009-08-05 trunk 24405) [i686-linux]
1

> I wonder that it might be intrinsically unreasonable to use
> primitive data types for such a purpose.

Hash can be used, with compare_by_identity.
-- 
Tanaka Akira

In This Thread