From: Robert Klemme Date: 2006-05-02T02:18:57+09:00 Subject: Re: Shortcut for [string].pack("p*").unpack("l").first ? 2006/5/1, Berger, Daniel : > > What do you want with a memory address in Ruby-land? If > > you're in an extension then there's probably an easier way to > > get at the address. > > Short answer: Win32API Here you got me convinced. > strcmp1 = Win32API.new('msvcrt', 'strcmp', 'PP', 'I') > strcmp2 = Win32API.new('msvcrt', 'strcmp', 'LL', 'I') > > str1 = "hello" > str2 = "hello" > str3 = "world" > > addr1 = [str1].pack("p*").unpack("l").first > addr2 = [str2].pack("p*").unpack("l").first > addr3 = [str3].pack("p*").unpack("l").first > > # Using strings > strcmp1.call(str1, str2) # 0 > strcmp1.call(str1, str3) # -1 > > # Using string addresses > strcmp2.call(addr1, addr2) # 0 > strcmp2.call(addr1, addr3) # -1 Now you lost me again: if you can use a string as well as a pointer then why bother to use the pointer? Are there places where you cannot do that? > I suppose I could stop whining and just extend the String class. :) That's definitively an option. :-)) > class String > def ptr > [self].pack("p*").unpack("l").first > end > end Just a thought: does it make sense to raise an exception or print a warning if the string is not frozen? Otherwise the address could point into limbo... Cheers robert -- Have a look: http://www.flickr.com/photos/fussel-foto/