From: Motohiro T. <mo...@gm...> - 2007-07-15 13:01:29
|
Hi, I'm wondering how to return simple "int" type value from Ruby code to Objective-C code. Ruby code passes Fixnum, and Objective-C code recieves NSCFNumber instead of simple int. Any suggestion ? Ruby code: class Hoge < OSX::NSObject def getInt 5 end end Objective-C code: Class helper = NSClassFromString(@"Hoge"); id hoge = [[helper alloc] init]; NSLog(@"%@ %d", [[hoge getInt] class], [(NSNumber *)[hoge getInt] decimalValue]); and those show: 2007-07-15 21:52:56.954 retval[5100] NSCFNumber 8448 thanks, -- Motohiro Takayama http://blog.deadbeaf.org/ |
From: Laurent S. <lsa...@ap...> - 2007-07-15 13:38:49
|
When creating a Ruby method like this, without providing its ObjC runtime signature, RubyCocoa will assume that all arguments and the return value are Objective-C objects (of the type 'id'). Because there is no way for RubyCocoa to know. This is why you get from the ObjC world an NSNumber and not an "int". To work around this, you need to register the Ruby method into the ObjC runtime: def getInt ... end objc_method :getInt, 'int' This will register getInt as a method that doesn't take any argument and returns a C integer. Usually when you are overriding an ObjC method from Ruby, or implementing an ObjC informal protocol in Ruby, you don't need to use objc_method. But in this special case, it is required. Fortunately, most people won't need to use it. Laurent On Jul 15, 2007, at 3:01 PM, Motohiro Takayama wrote: > Hi, > > I'm wondering how to return simple "int" type value from Ruby code to > Objective-C code. > Ruby code passes Fixnum, and Objective-C code recieves NSCFNumber > instead of simple int. > Any suggestion ? > > > Ruby code: > > class Hoge < OSX::NSObject > def getInt > 5 > end > end > > > Objective-C code: > > Class helper = NSClassFromString(@"Hoge"); > id hoge = [[helper alloc] init]; > NSLog(@"%@ %d", [[hoge getInt] class], [(NSNumber *)[hoge getInt] > decimalValue]); > > > and those show: > > 2007-07-15 21:52:56.954 retval[5100] NSCFNumber 8448 > > > thanks, > > -- > Motohiro Takayama > http://blog.deadbeaf.org/ > > ------------------------------------------------------------------------- > This SF.net email is sponsored by DB2 Express > Download DB2 Express C - the FREE version of DB2 express and take > control of your XML. No limits. Just data. Click to get it now. > http://sourceforge.net/powerbar/db2/ > _______________________________________________ > Rubycocoa-talk mailing list > Rub...@li... > https://lists.sourceforge.net/lists/listinfo/rubycocoa-talk |
From: Motohiro T. <mo...@gm...> - 2007-07-15 13:55:31
|
Laurent: Thanks for your quick reply. I tried your advice, and observed strange behavior. class Hoge < OSX::NSObject objc_method :getInt, 'int' def getInt 5 end end and when call this, NSLog shows: 2007-07-15 22:50:15.667 retval[7097] XXX returning ffi type void for unrecognized encoding 'nt' I'm wondering why "i" of int is lack... 2007/7/15, Laurent Sansonetti <lsa...@ap...>: > When creating a Ruby method like this, without providing its ObjC > runtime signature, RubyCocoa will assume that all arguments and the > return value are Objective-C objects (of the type 'id'). Because there > is no way for RubyCocoa to know. This is why you get from the ObjC > world an NSNumber and not an "int". > > To work around this, you need to register the Ruby method into the > ObjC runtime: > > def getInt ... end > objc_method :getInt, 'int' > > This will register getInt as a method that doesn't take any argument > and returns a C integer. > > Usually when you are overriding an ObjC method from Ruby, or > implementing an ObjC informal protocol in Ruby, you don't need to use > objc_method. But in this special case, it is required. Fortunately, > most people won't need to use it. > > Laurent > > On Jul 15, 2007, at 3:01 PM, Motohiro Takayama wrote: > > > Hi, > > > > I'm wondering how to return simple "int" type value from Ruby code to > > Objective-C code. > > Ruby code passes Fixnum, and Objective-C code recieves NSCFNumber > > instead of simple int. > > Any suggestion ? > > > > > > Ruby code: > > > > class Hoge < OSX::NSObject > > def getInt > > 5 > > end > > end > > > > > > Objective-C code: > > > > Class helper = NSClassFromString(@"Hoge"); > > id hoge = [[helper alloc] init]; > > NSLog(@"%@ %d", [[hoge getInt] class], [(NSNumber *)[hoge getInt] > > decimalValue]); > > > > > > and those show: > > > > 2007-07-15 21:52:56.954 retval[5100] NSCFNumber 8448 > > > > > > thanks, > > > > -- > > Motohiro Takayama > > http://blog.deadbeaf.org/ > > > > ------------------------------------------------------------------------- > > This SF.net email is sponsored by DB2 Express > > Download DB2 Express C - the FREE version of DB2 express and take > > control of your XML. No limits. Just data. Click to get it now. > > http://sourceforge.net/powerbar/db2/ > > _______________________________________________ > > Rubycocoa-talk mailing list > > Rub...@li... > > https://lists.sourceforge.net/lists/listinfo/rubycocoa-talk > > > ------------------------------------------------------------------------- > This SF.net email is sponsored by DB2 Express > Download DB2 Express C - the FREE version of DB2 express and take > control of your XML. No limits. Just data. Click to get it now. > http://sourceforge.net/powerbar/db2/ > _______________________________________________ > Rubycocoa-talk mailing list > Rub...@li... > https://lists.sourceforge.net/lists/listinfo/rubycocoa-talk > |
From: Laurent S. <lsa...@ap...> - 2007-07-15 13:58:58
|
Oops, please try objc_method :getInt, ['int'] The second argument of objc_method is supposed to be an Array. I will fix the method to accept a String. Laurent On Jul 15, 2007, at 3:55 PM, Motohiro Takayama wrote: > Laurent: > > Thanks for your quick reply. > > I tried your advice, and observed strange behavior. > > class Hoge < OSX::NSObject > objc_method :getInt, 'int' > def getInt > 5 > end > end > > and when call this, NSLog shows: > > 2007-07-15 22:50:15.667 retval[7097] XXX returning ffi type void for > unrecognized encoding 'nt' > > I'm wondering why "i" of int is lack... > > 2007/7/15, Laurent Sansonetti <lsa...@ap...>: >> When creating a Ruby method like this, without providing its ObjC >> runtime signature, RubyCocoa will assume that all arguments and the >> return value are Objective-C objects (of the type 'id'). Because >> there >> is no way for RubyCocoa to know. This is why you get from the ObjC >> world an NSNumber and not an "int". >> >> To work around this, you need to register the Ruby method into the >> ObjC runtime: >> >> def getInt ... end >> objc_method :getInt, 'int' >> >> This will register getInt as a method that doesn't take any argument >> and returns a C integer. >> >> Usually when you are overriding an ObjC method from Ruby, or >> implementing an ObjC informal protocol in Ruby, you don't need to use >> objc_method. But in this special case, it is required. Fortunately, >> most people won't need to use it. >> >> Laurent >> >> On Jul 15, 2007, at 3:01 PM, Motohiro Takayama wrote: >> >>> Hi, >>> >>> I'm wondering how to return simple "int" type value from Ruby code >>> to >>> Objective-C code. >>> Ruby code passes Fixnum, and Objective-C code recieves NSCFNumber >>> instead of simple int. >>> Any suggestion ? >>> >>> >>> Ruby code: >>> >>> class Hoge < OSX::NSObject >>> def getInt >>> 5 >>> end >>> end >>> >>> >>> Objective-C code: >>> >>> Class helper = NSClassFromString(@"Hoge"); >>> id hoge = [[helper alloc] init]; >>> NSLog(@"%@ %d", [[hoge getInt] class], [(NSNumber *)[hoge >>> getInt] >>> decimalValue]); >>> >>> >>> and those show: >>> >>> 2007-07-15 21:52:56.954 retval[5100] NSCFNumber 8448 >>> >>> >>> thanks, >>> >>> -- >>> Motohiro Takayama >>> http://blog.deadbeaf.org/ >>> >>> ------------------------------------------------------------------------- >>> This SF.net email is sponsored by DB2 Express >>> Download DB2 Express C - the FREE version of DB2 express and take >>> control of your XML. No limits. Just data. Click to get it now. >>> http://sourceforge.net/powerbar/db2/ >>> _______________________________________________ >>> Rubycocoa-talk mailing list >>> Rub...@li... >>> https://lists.sourceforge.net/lists/listinfo/rubycocoa-talk >> >> >> ------------------------------------------------------------------------- >> This SF.net email is sponsored by DB2 Express >> Download DB2 Express C - the FREE version of DB2 express and take >> control of your XML. No limits. Just data. Click to get it now. >> http://sourceforge.net/powerbar/db2/ >> _______________________________________________ >> Rubycocoa-talk mailing list >> Rub...@li... >> https://lists.sourceforge.net/lists/listinfo/rubycocoa-talk >> > > ------------------------------------------------------------------------- > This SF.net email is sponsored by DB2 Express > Download DB2 Express C - the FREE version of DB2 express and take > control of your XML. No limits. Just data. Click to get it now. > http://sourceforge.net/powerbar/db2/ > _______________________________________________ > Rubycocoa-talk mailing list > Rub...@li... > https://lists.sourceforge.net/lists/listinfo/rubycocoa-talk |
From: Motohiro T. <mo...@gm...> - 2007-07-15 14:18:55
|
Right, I got correct return value ! thank you for your help. 2007/7/15, Laurent Sansonetti <lsa...@ap...>: > Oops, please try > > objc_method :getInt, ['int'] > > The second argument of objc_method is supposed to be an Array. I will > fix the method to accept a String. > > Laurent > > On Jul 15, 2007, at 3:55 PM, Motohiro Takayama wrote: > > > Laurent: > > > > Thanks for your quick reply. > > > > I tried your advice, and observed strange behavior. > > > > class Hoge < OSX::NSObject > > objc_method :getInt, 'int' > > def getInt > > 5 > > end > > end > > > > and when call this, NSLog shows: > > > > 2007-07-15 22:50:15.667 retval[7097] XXX returning ffi type void for > > unrecognized encoding 'nt' > > > > I'm wondering why "i" of int is lack... > > > > 2007/7/15, Laurent Sansonetti <lsa...@ap...>: > >> When creating a Ruby method like this, without providing its ObjC > >> runtime signature, RubyCocoa will assume that all arguments and the > >> return value are Objective-C objects (of the type 'id'). Because > >> there > >> is no way for RubyCocoa to know. This is why you get from the ObjC > >> world an NSNumber and not an "int". > >> > >> To work around this, you need to register the Ruby method into the > >> ObjC runtime: > >> > >> def getInt ... end > >> objc_method :getInt, 'int' > >> > >> This will register getInt as a method that doesn't take any argument > >> and returns a C integer. > >> > >> Usually when you are overriding an ObjC method from Ruby, or > >> implementing an ObjC informal protocol in Ruby, you don't need to use > >> objc_method. But in this special case, it is required. Fortunately, > >> most people won't need to use it. > >> > >> Laurent > >> > >> On Jul 15, 2007, at 3:01 PM, Motohiro Takayama wrote: > >> > >>> Hi, > >>> > >>> I'm wondering how to return simple "int" type value from Ruby code > >>> to > >>> Objective-C code. > >>> Ruby code passes Fixnum, and Objective-C code recieves NSCFNumber > >>> instead of simple int. > >>> Any suggestion ? > >>> > >>> > >>> Ruby code: > >>> > >>> class Hoge < OSX::NSObject > >>> def getInt > >>> 5 > >>> end > >>> end > >>> > >>> > >>> Objective-C code: > >>> > >>> Class helper = NSClassFromString(@"Hoge"); > >>> id hoge = [[helper alloc] init]; > >>> NSLog(@"%@ %d", [[hoge getInt] class], [(NSNumber *)[hoge > >>> getInt] > >>> decimalValue]); > >>> > >>> > >>> and those show: > >>> > >>> 2007-07-15 21:52:56.954 retval[5100] NSCFNumber 8448 > >>> > >>> > >>> thanks, > >>> > >>> -- > >>> Motohiro Takayama > >>> http://blog.deadbeaf.org/ > >>> > >>> ------------------------------------------------------------------------- > >>> This SF.net email is sponsored by DB2 Express > >>> Download DB2 Express C - the FREE version of DB2 express and take > >>> control of your XML. No limits. Just data. Click to get it now. > >>> http://sourceforge.net/powerbar/db2/ > >>> _______________________________________________ > >>> Rubycocoa-talk mailing list > >>> Rub...@li... > >>> https://lists.sourceforge.net/lists/listinfo/rubycocoa-talk > >> > >> > >> ------------------------------------------------------------------------- > >> This SF.net email is sponsored by DB2 Express > >> Download DB2 Express C - the FREE version of DB2 express and take > >> control of your XML. No limits. Just data. Click to get it now. > >> http://sourceforge.net/powerbar/db2/ > >> _______________________________________________ > >> Rubycocoa-talk mailing list > >> Rub...@li... > >> https://lists.sourceforge.net/lists/listinfo/rubycocoa-talk > >> > > > > ------------------------------------------------------------------------- > > This SF.net email is sponsored by DB2 Express > > Download DB2 Express C - the FREE version of DB2 express and take > > control of your XML. No limits. Just data. Click to get it now. > > http://sourceforge.net/powerbar/db2/ > > _______________________________________________ > > Rubycocoa-talk mailing list > > Rub...@li... > > https://lists.sourceforge.net/lists/listinfo/rubycocoa-talk > > > ------------------------------------------------------------------------- > This SF.net email is sponsored by DB2 Express > Download DB2 Express C - the FREE version of DB2 express and take > control of your XML. No limits. Just data. Click to get it now. > http://sourceforge.net/powerbar/db2/ > _______________________________________________ > Rubycocoa-talk mailing list > Rub...@li... > https://lists.sourceforge.net/lists/listinfo/rubycocoa-talk > |
From: Satoshi N. <sna...@in...> - 2007-07-15 15:19:31
|
Hi Laurent. > objc_method :getInt, ['int'] > > The second argument of objc_method is supposed to be an Array. I will > fix the method to accept a String. I think it might be difficult. Because the second argument accepts a string in raw encodings like 'i@:'. -- Satoshi Nakagawa On 2007/07/15, at 22:58, Laurent Sansonetti wrote: > Oops, please try > > objc_method :getInt, ['int'] > > The second argument of objc_method is supposed to be an Array. I will > fix the method to accept a String. > > Laurent > > On Jul 15, 2007, at 3:55 PM, Motohiro Takayama wrote: > >> Laurent: >> >> Thanks for your quick reply. >> >> I tried your advice, and observed strange behavior. >> >> class Hoge < OSX::NSObject >> objc_method :getInt, 'int' >> def getInt >> 5 >> end >> end >> >> and when call this, NSLog shows: >> >> 2007-07-15 22:50:15.667 retval[7097] XXX returning ffi type void for >> unrecognized encoding 'nt' >> >> I'm wondering why "i" of int is lack... >> >> 2007/7/15, Laurent Sansonetti <lsa...@ap...>: >>> When creating a Ruby method like this, without providing its ObjC >>> runtime signature, RubyCocoa will assume that all arguments and the >>> return value are Objective-C objects (of the type 'id'). Because >>> there >>> is no way for RubyCocoa to know. This is why you get from the ObjC >>> world an NSNumber and not an "int". >>> >>> To work around this, you need to register the Ruby method into the >>> ObjC runtime: >>> >>> def getInt ... end >>> objc_method :getInt, 'int' >>> >>> This will register getInt as a method that doesn't take any argument >>> and returns a C integer. >>> >>> Usually when you are overriding an ObjC method from Ruby, or >>> implementing an ObjC informal protocol in Ruby, you don't need to use >>> objc_method. But in this special case, it is required. Fortunately, >>> most people won't need to use it. >>> >>> Laurent >>> >>> On Jul 15, 2007, at 3:01 PM, Motohiro Takayama wrote: >>> >>>> Hi, >>>> >>>> I'm wondering how to return simple "int" type value from Ruby code >>>> to >>>> Objective-C code. >>>> Ruby code passes Fixnum, and Objective-C code recieves NSCFNumber >>>> instead of simple int. >>>> Any suggestion ? >>>> >>>> >>>> Ruby code: >>>> >>>> class Hoge < OSX::NSObject >>>> def getInt >>>> 5 >>>> end >>>> end >>>> >>>> >>>> Objective-C code: >>>> >>>> Class helper = NSClassFromString(@"Hoge"); >>>> id hoge = [[helper alloc] init]; >>>> NSLog(@"%@ %d", [[hoge getInt] class], [(NSNumber *)[hoge >>>> getInt] >>>> decimalValue]); >>>> >>>> >>>> and those show: >>>> >>>> 2007-07-15 21:52:56.954 retval[5100] NSCFNumber 8448 >>>> >>>> >>>> thanks, >>>> >>>> -- >>>> Motohiro Takayama >>>> http://blog.deadbeaf.org/ |
From: Laurent S. <lsa...@ap...> - 2007-07-15 15:23:28
|
On Jul 15, 2007, at 5:19 PM, Satoshi Nakagawa wrote: > Hi Laurent. > >> objc_method :getInt, ['int'] >> >> The second argument of objc_method is supposed to be an Array. I will >> fix the method to accept a String. > > I think it might be difficult. > Because the second argument accepts a string in raw encodings like > 'i@:'. True, I also figured that. Let's keep the current behavior. Looks like I wrote too fast :-) Laurent |