str = "I am a good boy"
我想要结果"boy good a am I"
。我可以使用内置的Ruby方法来反转字符串,如:
str.split(" ").reverse.join(" ") #=> "boy good a am I"
如果不使用Ruby内置方法,有没有办法做到这一点?
答案 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
,&&
,||
,and
和or
没有相应的方法。所以,你可以使用它们。