有没有人在这个简单的Ruby函数中看到错误?

时间:2017-03-29 20:12:28

标签: ruby

此函数应该采用字符串并以相反的顺序返回字符。

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_user_interface);

        mShoppingList = (ListView) findViewById(R.id.shopping_listView);
        mItemEdit = (EditText) findViewById(R.id.item_editText);
        mAddButton = (Button) findViewById(R.id.add_button);

        mAdapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1);
        mShoppingList.setAdapter(mAdapter);

        mAddButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String item = mItemEdit.getText().toString();
                final String Art=item;
                mAdapter.add(item);
                mAdapter.notifyDataSetChanged();
                mItemEdit.setText("");

然而所有测试都返回false:

def reverse(string)

    reversedString = "";

        i = string.length - 1
        while i >= 0
          reversedString = reversedString + string[i]
          i -= 1
        end
    puts reversedString

end

有谁看到问题是什么?

5 个答案:

答案 0 :(得分:4)

尝试使用默认的String类reverse方法,如下所示:

"Hello World".reverse
"Hello World".reverse!

https://ruby-doc.org/core-2.4.0/String.html

检查Ruby的String类API

如果您想制作自定义方法,可以使用以下地图:

string = String.new
"Hello World".chars.each { | c | string.prepend c }

答案 1 :(得分:2)

问题是你的功能没有返回它的结果,它正在打印它。它需要return reversedString

根据经验,函数应该返回结果。另一个功能应该格式化并打印它。

def reverse(string)
    reversedString = "";

    i = string.length - 1
    while i >= 0
        reversedString = reversedString + string[i]
        i -= 1
    end

    return reversedString
end

注意:这可能是一个练习,但Ruby已经有String#reverse

你写测试很好,但是你写它们的方式很难说出错了。查看像MiniTest这样的Ruby测试框架。

require "minitest/autorun"

class TestReverse < Minitest::Test
    def test_reverse
        assert_equal "cba", reverse("abc")
        assert_equal "a", reverse("a")
        assert_equal "", reverse("")
    end
end

那会告诉你,你的函数正在返回nil

  1) Failure:
TestReverse#test_reverse [test.rb:16]:
Expected: "cba"
  Actual: nil

答案 2 :(得分:2)

为了使这更像Ruby,但避免使用内置的String#reverse方法,你可以这样做:

def reverse(string)
  string.chars.reverse.join('')
end

请记住,在Ruby中,上一次操作的结果是自动方法的返回值。在你的情况下,最后一个操作是puts,它总是返回nil,吃掉你的价值。你想传递它。

尝试设计具有简单任务的方法,也就是说,此功能应专注于仅执行一个作业和一个作业:反转字符串。显示它超出了这个要求,所以这是另一种方法的工作,也许是调用者。

要避免调用任何类型的reverse方法:

def reverse(string)
  result = ''
  length = string.length

  length.times do |i|
    result << string[length - 1 - i]
  end

  result
end

如果您使用for或范围while之类的内容进行迭代,您通常可以经常避免times几乎完全避免(0..n) {/ 1}}。

答案 3 :(得分:1)

puts打印并返回nil,因此整个方法返回nil。如果出于调试原因,您想要检查返回的方法,请使用p返回它的参数(在本例中为reversedString)。

def reverse(string)

    reversedString = ""
    i = string.length - 1
    while i >= 0
      reversedString = reversedString + string[i]
      i -= 1
    end
    p reversedString  # !!!

end

并且所有3个测试都返回true

答案 4 :(得分:0)

如果我打算这样做,我可能会利用一个阵列:

ary = 'foo bar baz'.chars
reversed_ary = []
ary.size.times do
  reversed_ary << ary.pop
end
reversed_ary.join # => "zab rab oof"

pop从数组中删除最后一个字符并将其返回,所以基本上它会向后走过ary,在最后啃着并将每个字符推到reversed_ary的末尾颠倒阵列。

或者可以使用字符串来完成:

ary = 'foo bar baz'.chars
reversed_str = ''
ary.size.times do
  reversed_str << ary.pop
end
reversed_str # => "zab rab oof"

或:

reversed_str += ary.pop

我刚看到@tadman对字符串做了类似的事情。他会跑得更快,但这更具可读性,至少对我而言。