Ruby C 绑定的执行与系统调用的 Ruby 包装器之间的主要区别是什么?
对于我的上下文问题,我正在考虑将 Git 版本控制功能大量合并到 Ruby on Rails 应用程序中。在完成这项任务时,我不明白如何考虑 Ruby 程序的执行管道,该程序结合了使用 Ruby C 绑定实现的库,例如yajl-ruby与用于系统调用的 Ruby 包装器,例如git Ruby Gem。
由于Ruby允许你在性能至关重要的任何位置下载到C中,并且普通的Ruby不能完成任务,并且由于C允许你在相同的情况下进入汇编,我总是想知道它是否会可以在Ruby代码中嵌入汇编语言,首先是下拉到C,然后从C代码中下载到汇编.
我一直希望这是可能的,但直到现在才发现任何确认或否认的东西.因为对于一个侧面项目上的Qt(因此C++)的研究,我偶然发现了一份声明与C&C ruby-lang.com的Ruby的比较++在Ruby中
- 你不能下降到装配
这是否意味着你不能直接去装配,或者你不能通过C来做到这一点?如果你在C中编写Ruby的扩展怎么样:我可以假设,因为那只是C(不是嵌入在Ruby中)你仍然可以在那里使用程序集,Ruby仍然可以在其中使用C扩展程序吗?
我按照http://people.apache.org/~rooneg/talks/ruby-extensions/ruby-extensions.html(第6页)的说明操作,我的make命令只返回make: Nothing to be done for 'all'.
有没有人有任何想法?
我使用的是ruby 1.9.2,我在OSX 10.6.8上
SHELL = /bin/sh
#### Start of system configuration section. ####
srcdir = .
topdir = /Users/pcoder/.rvm/rubies/ruby-1.9.2-p290/include/ruby-1.9.1
hdrdir = /Users/pcoder/.rvm/rubies/ruby-1.9.2-p290/include/ruby-1.9.1
arch_hdrdir = /Users/pcoder/.rvm/rubies/ruby-1.9.2-p290/include/ruby-1.9.1/$(arch)
VPATH = $(srcdir):$(arch_hdrdir)/ruby:$(hdrdir)/ruby
prefix = $(DESTDIR)/Users/pcoder/.rvm/rubies/ruby-1.9.2-p290
rubylibprefix = $(libdir)/$(RUBY_BASE_NAME)
exec_prefix = $(prefix)
vendorhdrdir = $(rubyhdrdir)/vendor_ruby
sitehdrdir = $(rubyhdrdir)/site_ruby
rubyhdrdir = $(includedir)/$(RUBY_BASE_NAME)-$(ruby_version)
vendordir = $(rubylibprefix)/vendor_ruby
sitedir = $(rubylibprefix)/site_ruby
ridir = $(datarootdir)/$(RI_BASE_NAME)
mandir = $(datarootdir)/man
localedir = $(datarootdir)/locale
libdir = $(exec_prefix)/lib
psdir = $(docdir)
pdfdir = …Run Code Online (Sandbox Code Playgroud) 我试图了解String#capitalize!内部如何运作.我可以创建一个哈希.给定字符串foo = "the",foo[0]是"t",查找lower_case "t",并将其与大写"T"值匹配.实际上,Ruby源代码显示:
static VALUE
rb_str_capitalize_bang(VALUE str)
{
rb_encoding *enc;
char *s, *send;
int modify = 0;
unsigned int c;
int n;
str_modify_keep_cr(str);
enc = STR_ENC_GET(str);
rb_str_check_dummy_enc(enc);
if (RSTRING_LEN(str) == 0 || !RSTRING_PTR(str)) return Qnil;
s = RSTRING_PTR(str); send = RSTRING_END(str);
c = rb_enc_codepoint_len(s, send, &n, enc);
if (rb_enc_islower(c, enc)) {
rb_enc_mbcput(rb_enc_toupper(c, enc), s, enc);
modify = 1;
}
s += n;
while (s < send) { …Run Code Online (Sandbox Code Playgroud)