Ruby默认块和产量

时间:2016-08-25 03:39:40

标签: ruby string methods block yield

我正在解决以下问题:

describe "some silly block functions" do
  describe "reverser" do
    it "reverses the string returned by the default block" do
      result = reverser do
        "hello"
      end

      expect(result).to eq("olleh")
    end

根据我的理解,这应该反转一个字符串。我的代码如下:

def reverser
    yield "hello"
end

reverser do |i|
    puts i.reverse
end

这只是返回“你好”。我可能会遗漏一些关于yield,块和函数如何相互作用的基本概念。我该怎样做我想要完成的事情?

5 个答案:

答案 0 :(得分:3)

答案是好的和正确的,但也许它仍然无济于事。

您应该从您的规范开始:

  

它"反转默认块"

返回的字符串

所以,你的方法应该做的很清楚:

def reverser
  # should reverse the string returned by the default block
end

现在让我们看看如何实现它。好吧,它应该扭转一些东西。但是什么?我们来看看:

  

默认块返回的字符串

这表明我们需要执行默认块并获取其返回值。让我们看看docs说的是什么:

  

yield - 从方法体内部调用,对作为方法调用的一部分提供的代码块(如果有)进行控制。 ...对yield的调用值是执行代码块的值。

因此,您的方法似乎需要执行yield。它将执行一个块并返回该块返回的值。所以,只需在那里放yield

def reverser
  yield
end

如果你运行你的规范,它会抱怨 - 你会看到字符串仍然没有反转。那么,你的方法有什么用呢:

def reverser
  yield.reverse
end

那就是它。

答案 1 :(得分:0)

您需要在let parameters : [String : AnyObject] = [ "FriendlyName": "foo", "UniqueName": "bar15", "Attributes": [ "foo": "bar", "bar": "foo" ], "Type": "private" ] Alamofire.request(.POST, "https://ip-messaging.twilio.com/v1/Services/\(instanceSID)/Channels", parameters: parameters, encoding: .JSON) .authenticate(user: user, password: password) .responseJSON { response in let response = String(response.result.value) print(response) } 中包含反转字符串的逻辑。

reverser

但是为什么还要使用块呢?使用普通参数要清楚得多。

def reverser
  yield.reverse
end

答案 2 :(得分:0)

如果你想在块中反转字符串,那么你需要得到调用块的结果并将其反转。

def reverser(str)
  str.reverse
end

reverser('hello')  #=> olleh

答案 3 :(得分:0)

我知道已经过了一年,但这个问题还没有得到解决。

def reverser
  out = []
  yield.split.each{|word| out << word.reverse}
  out.join(" ")
end

我很确定它与范围

有关

答案 4 :(得分:-1)

我同意上述回应 - 他们最有意义。但是想要添加为什么你的代码不起作用以及如何解决它:

  

期待(结果).to eq(“olleh”)

所以根据你想要结果返回一个字符串。它是这样做的吗?

  1. 将回报设为零。当你在方法的末尾放置时 - 请注意该方法将返回nil。这是阴险的,因为有时结果不是预期的结果。
  2. 但你期待它返回'olleh'
  3. 摆脱掉落,它应该像你期望的那样工作(未经测试)
  4. def reverser
      yield "hello"
    end
    
    reverser do |i|
      i.reverse  # NOTE THAT THE PUTS is missing here
    end
    

    我认为这就是你要找的东西。

    编辑:请测试并告诉我,因为有些人认为我的答案完全错了!当然你不想依赖你所使用的特定块作为设计点,但是这应该让你知道它为什么不起作用