在Ruby on Rails中执行Objective-C

4
我希望在我的Rails应用程序中执行以下Objective-C代码:

CFMutableStringRef inputString = CFStringCreateMutableCopy(kCFAllocatorDefault, 32,     CFSTR("общей"));
CFLocaleRef locale = CFLocaleCreate(kCFAllocatorDefault, CFSTR("ru"));

CFStringTransform(inputString, NULL, kCFStringTransformStripDiacritics, false);
CFStringLowercase(inputString, locale);


NSLog(@"%@", (NSString *)inputString);

CFRelease(locale);
CFRelease(inputString);

该程序基本上会输出不带重音符号的小写版本输入字符串。我正在运行在雪豹服务器上。

我该怎样实现这个功能(不使用 MacRuby,因为这似乎有点过度杀手锏)?我听说过 Ruby 扩展,但在我的情况下找不到任何资源。


这似乎更像是一个纯粹的 Ruby 问题:“如何从字符串中去除变音符号?”答案:https://dev59.com/BnVC5IYBdhLWcg3wpS7g - rob mayoff
不幸的是,情况并不那么简单... 我需要使用本地的Objective-C函数,因为我还要处理非拉丁字符(如印地语、普通话、俄语等)。 - alste
@alste:有点学究,但上面没有Objective-C。你正在使用来自Core Foundation的常量和函数,这是一个C库。无论如何,Rails能否调用位于文件系统上的二进制文件?如果可以,请将上述内容作为自己的小工具,然后根据需要调用它,将输入字符串作为参数传递。请注意,如果这样做,请记住不要使用NSLog(),因为它太吵了。 - lowell
谢谢您的建议。我已经考虑过了,但是如果要调用二进制数千次(例如在将新的外语单词插入数据库时,我希望存储它们的小写/无变音符号版本),那么这将会非常麻烦。有没有更本地的方法可以从Ruby中调用Core Foundation函数呢? - alste
创建一个使用命名管道的小应用程序,然后您可以使用该管道进行写入/读取操作,如何? - Francisco Soto
1
此外,Ruby(特别是1.9版本)可以很好地处理非拉丁字符。在这里,您可能根本不需要Obj-C。 - Marnen Laibow-Koser
2个回答

1

您可能可以使用ffi完成它,但需要输入一堆函数规范。通过以下简单测试案例来调用Core Foundation函数:

require 'ffi'

module CF
  extend FFI::Library
  ffi_lib '/System/Library/Frameworks/CoreFoundation.framework/CoreFoundation'
  attach_function :CFAbsoluteTimeGetCurrent, [], :double
end

puts CF.CFAbsoluteTimeGetCurrent

0

Ruby扩展是正确的选择。 - alste

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接