如何在rails上传递ruby中的参数

时间:2015-02-22 12:07:04

标签: ruby-on-rails ruby

我的代码存在问题,它不需要参数,我想创建一个返回答案的方法。我不知道如何通过价值。 请问这个概念的名称是什么,所以我可以阅读。

describe "reverser" do
it "reverses the string returned by the default block" do
  result = reverser do
    "hello"
  end
  result.should == "olleh"
end
end

def reverser(sent)
words = sent.split(" ")
  i = 0
  while i < words.length
   words[i] = words[i].reverse
   i += 1
  end
  words.join(" ")
end

2 个答案:

答案 0 :(得分:3)

def reverser
  yield.reverse
end

以下是相关代码:

result = reverser do
  "hello"
end

这相当于:

result = reverser() do
  "hello"
end

打破这一点:

    method call -+      +- 'do' marks the start of the block
                 |      |
                 V      V 
    result = reverser() do
      "hello"
    end
     ^
     |
     +--- end of the block

块就像一个方法,就好像块作为一个不可见的参数传递给reverse()方法。在reverse()内,您可以使用yield

调用块
def reverser
  return_value_of_block = yield
  return_value_of_block.reverse
end

撰写yieldyield()就像撰写unamed_block_method()一样。换句话说,yield是ruby为块方法赋予的名称。

如果该块应该接受参数,那么该块将如下所示:

result = do_stuff do |x|
  x * 2
end

do_stuff()将如下所示:

def do_stuff
  return_value_of_block = yield(4)  #call block with the argument 4
end
  

请问这个概念的名称是什么,所以我可以读一读。

搜索ruby blocks

答案 1 :(得分:0)

您的反向器会使用您调用的块来获取它的返回值:

def reverser(&block)
  string = block.call
  string.reverse
end

注意:您不需要string变量。我只是出于可读性的原因使用它。您也可以写block.call.reverse