我正在解决以下问题:
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,块和函数如何相互作用的基本概念。我该怎样做我想要完成的事情?
答案 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”)
所以根据你想要结果返回一个字符串。它是这样做的吗?
def reverser yield "hello" end reverser do |i| i.reverse # NOTE THAT THE PUTS is missing here end
我认为这就是你要找的东西。
编辑:请测试并告诉我,因为有些人认为我的答案完全错了!当然你不想依赖你所使用的特定块作为设计点,但是这应该让你知道它为什么不起作用