jeanp****@gmail*****
jeanp****@gmail*****
Sat Jan 6 04:32:24 JST 2007
On 1/5/07, Laurent Sansonetti <lsans****@apple*****> wrote: > > > On Jan 5, 2007, at 1:22 AM, jeanp****@gmail***** wrote: > > > On 1/4/07, Laurent Sansonetti <lsans****@apple*****> wrote: > > > > On Jan 5, 2007, at 12:31 AM, Tim Burks wrote: > > > I've found the same problem, it's related to the trick that is being > > > used to automatically import the class. When it automatically > > > imports a class in a class declaration, the wrong class is used when > > > the body of the class is parsed. > > > > > > For example, add this "puts" to your code and rerun it (or use > > > OSX.NSLog). > > > > > >> class OSX::SchoolKid > > > puts self.superclass > > >> def saySomething > > >> puts "hi" > > >> end > > >> end > > > > > > You'll probably see that it's "Object" instead of OSX::NSObject. > > > > Ah this is indeed another problem that should also be addressed. But > > the original problem (overriding methods directly in the class) is > > still pertinent, RubyCocoa doesn't allow it yet. > > > > if it would be helpful, i can file it as a bug/ER. > > > > even after i explicitly ns_import :SchoolKid, i wasn't able to > > override the method and instead got a runtime error: > > RuntimeError: could not add 'saySomething' to class '': Objective- > > C cannot find it in the superclass > > OK so I spent the past hours fixing this :-) > > So bug number one, you can now do "class MyClass" directly and add > methods there. RubyCocoa will automatically set the right super class > for you. In fact it was already doing it, but only if you explicitly > prefixed the class name by OSX. Now you can have the OSX module > included and it will also work. > > Bug number two, if you overrode methods in your Ruby class, RubyCocoa > will override the Objective-C side for you. > > And finally, but number three, you can now add new methods in a given > Objective-C class from Ruby. > > Example! > > $ cat test.rb > require 'osx/cocoa' > include OSX > > class NSURL > def host > 'xxx' > end > end > > p NSURL.URLWithString('http://google.com').performSelector('host').to_s > > class NSObject > def mySuperMethod > 'owned!' > end > objc_export :mySuperMethod, ['id'] > end > > p > NSString.stringWithCString('foo').performSelector('mySuperMethod').to_s > > $ ruby test.rb > "xxx" > "owned!" > > I committed everything in SVN and added some extra test cases. If you > want to test this :-) excellent, i synced and installed and now i can override with reckless abandon - mocking here i come. thanks for your hard work on this! cheers, jean-pierre -------------- next part -------------- An HTML attachment was scrubbed... Télécharger