Несомненно, есть путь. На самом деле мой любимый способ. Вы сказали, что не хотите использовать встроенные контроллеры Ruby. Ну, мы не будем. Как насчет родных расширений? Я знаю, что люди любят их.
Во-первых, создайте reverse/reverse.c
файл. Большинство источников я взял here.
#include "ruby/ruby.h"
void reverseWords(char *s)
{
char *word_begin = NULL;
char *temp = s;
while(*temp)
{
if ((word_begin == NULL) && (*temp != ' '))
{
word_begin=temp;
}
if(word_begin && ((*(temp+1) == ' ') || (*(temp+1) == '\0')))
{
reverse(word_begin, temp);
word_begin = NULL;
}
temp++;
}
reverse(s, temp-1);
}
void reverse(char *begin, char *end)
{
char temp;
while (begin < end)
{
temp = *begin;
*begin++ = *end;
*end-- = temp;
}
}
VALUE reverse_words(VALUE str)
{
char *s;
s = RSTRING_PTR(str);
reverseWords(s);
return str;
}
void Init_reverse_words()
{
VALUE string = rb_const_get(rb_cObject, rb_intern("String"));
rb_define_method(string, "reverse_words!", reverse_words, 0);
}
Во-вторых, создать reverse/extconf.rb
файл:
require 'mkmf'
create_makefile('reverse_words')
В-третьих, в терминале кд в reverse
папку и запустите:
$ ruby extconf.rb
$ make && make install
Наконец, проверить его на irb
,
irb(main):001:0> require 'reverse_words'
=> true
irb(main):002:0> "foo bar baz".reverse_words!
=> "baz bar foo"
Это способ отменить порядок слов без использования встроенных функций.
Это не реверсирование строки. Опишите это более правильно. – sawa
Я сам думаю, что ваш ответ уже достаточно хорош. Возможно, здесь можно использовать один метод меньше или нет, но отсутствие читаемости, вероятно, не стоит того. –
Если вы не используете встроенные методы ruby, то как вы собираетесь это делать? Многие просят об обратном; я впервые увидел, что кто-то спрашивает об этом. – sawa