翻译一句话

时间:2015-02-24 05:45:35

标签: ruby string

我想扭转一句话。例如,我的字符串如下所示。

 str = "I am a good boy"

我想要结果"boy good a am I"。我可以使用内置的Ruby方法来反转字符串,如:

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

如果不使用Ruby内置方法,有没有办法做到这一点?

5 个答案:

答案 0 :(得分: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"]

答案 1 :(得分: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')

第三次,在终端cd到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"

这是在不使用内置函数的情况下反转单词顺序的方法。

答案 2 :(得分:0)

试试这个

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(" ")

答案 3 :(得分:0)

你不能。

在ruby中,你总是会使用其他方法,或者重新实现一些已经存在的方法(就像其他答案一样)。

在C中,你可以使用动态长度数组,但在ruby中你必须使用builtins方法。

答案 4 :(得分:0)

  

如果不使用Ruby内置方法,有没有办法做到这一点?

没有

Ruby是一种面向对象的语言。在OO中,您通过调用方法来执行操作。没有其他方法可以执行任何操作。

好的,从技术上讲,还有一些角落,其中Ruby不是面向对象的:if&&||andor没有相应的方法。所以,你可以使用它们。