2015-02-24 2 views
-2

Я хочу отменить предложение. Например, моя строка выглядит следующим образом.Обратные слова предложения

str = "I am a good boy" 

Я хочу получить результат "boy good a am I". Я могу изменить строку с помощью встроенных методов Ruby, как:

str.split(" ").reverse.join(" ") #=> "boy good a am I" 

Есть ли способ сделать это без использования рубин встроенных методов?

+0

Это не реверсирование строки. Опишите это более правильно. – sawa

+0

Я сам думаю, что ваш ответ уже достаточно хорош. Возможно, здесь можно использовать один метод меньше или нет, но отсутствие читаемости, вероятно, не стоит того. –

+0

Если вы не используете встроенные методы ruby, то как вы собираетесь это делать? Многие просят об обратном; я впервые увидел, что кто-то спрашивает об этом. – sawa

ответ

2

Вы можете обратить массив по pop ИНГ каждый элемент в новый массив

arr, new_arr = ["I", "am", "a", "good", "boy"], [] 
for i in 0...arr.length do 
    new_arr << arr[arr.length - 1 - i] 
end 
new_arr 
# => ["boy", "good", "a", "am", "I"] 
+0

здесь также вы используете рубины, встроенные в функции, такие как pop. Я хочу решение, не используя его. –

+0

обновлен, чтобы использовать индекс для доступа к последнему элементу. – Santhosh

+0

длина также встроенный метод не так ли? Кроме того, вы начинаете с массива вместо строки ... – Antzi

0

TRY это

def reverse(string) 
    reverse = "" 
    index = 0 
    while index < string.length 
     reverse = string[index] + reverse 
     index += 1 
    end 
    return reverse 
end 

reverse_sent = reverse(""I am a good boy"") 
reverse_sent.split.map{|word| reverse(word)}.join(" ") 
+0

Вы использовали методы разделения и сопоставления и объединения – Antzi

+0

yes my bad, я обновлю его – Sontya

0

Вы не можете.

В рубине вы всегда будете использовать только другие методы или переопределить некоторые из них, которые уже существуют (как и в других ответах).

В C возможно, вы могли бы использовать динамический массив длины, но в рубине вы ДОЛЖНЫ использовать встроенные методы.

+0

Хм, он мог бы создать собственное расширение. – user2422869

+0

Это уже не рубин :) – Antzi

0

Есть ли способ сделать это без использования встроенных методов Ruby?

Номер

Рубин является объектно-ориентированным языком. В OO вы делаете что-то, вызывая методы. Нет другого способа выполнить какое-либо действие.

Хорошо, технически, есть некоторые уголки, где не объектно-ориентированных Рубин: if, &&, ||, and и or не имеют соответствующих методов. Итак, это все, что вы можете использовать.

2

Несомненно, есть путь. На самом деле мой любимый способ. Вы сказали, что не хотите использовать встроенные контроллеры 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" 

Это способ отменить порядок слов без использования встроенных функций.

+0

Этот ответ потрясающий. –

Смежные вопросы