来自文档:
int (^Multiply)(int, int) = ^(int num1, int num2) {
return num1 * num2;
};
int result = Multiply(7, 4); // result is 28
Run Code Online (Sandbox Code Playgroud)
它看起来很复杂 - 可以用函数完成同样的事情,或者不是吗?这个例子中的真正意义是什么?
您好我正在尝试学习红宝石块.但我很难克服这种结构:
class SomeApp
attr_accessor :load_listener
def on_load(&block)
@load_listener = block
end
def load(x)
@load_listener.call(x) if @load_listener
end
end
app = SomeApp.new
app.on_load { |x| puts 'on load #{x}'}
app.load(5)
Run Code Online (Sandbox Code Playgroud)
我不明白为什么这个代码的结果是'on load#{x}',而不是'on load 5' 任何帮助都是值得赞赏的.
在Eloquent Ruby中有一个我不明白的代码示例.
class Document
attr_accessor :save_listener
# most of the class omitted...
def on_save( &block )
@save_listener = block
end
def save( path )
File.open( path, 'w' ) { |f| f.print( @contents ) }
@save_listener.call( self, path ) if @save_listener
end
end
# usage
my_doc = Document.new( 'block based example', 'russ', '' )
my_doc.on_save do |doc|
puts "Hey, I've been saved!"
end
Run Code Online (Sandbox Code Playgroud)
为什么@save_listener.call( self, path )
需要两个参数?保存的块看起来只有一个参数|doc|
.这是书中的拼写错误还是我在这里缺少什么?
我甚至尝试输入此代码并执行它,我发现我可以添加任意数量的参数,并且不会出现任何错误.但我仍然不明白为什么在这个例子中有两个参数.
我是iOS的新手,我正在试图弄清楚使用它们的正确方法.这是我的设置:
我有一个方法foo
,它返回一个操作(RKObjectRequestOperation
)成功与否.我为操作提供了一个成功块和一个失败块,所以在成功块中我想foo
返回YES,并且在故障块中我想foo
返回NO
.
例如:
- (BOOL) foo {
RKObjectRequestOperation *request = [[RKObjectRequestOperation alloc] initWithRequest:urlRequest responseDescriptors:responseDescriptors];
[request setCompletionBlockWithSuccess:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) {
NSLog(@"Success!");
// return YES?
} failure:^(RKObjectRequestOperation *operation , NSError *error) {
NSLog(@"Failure!");
// return NO?
}];
[request start];
}
Run Code Online (Sandbox Code Playgroud)
但是,据我所知,一个块只能返回自己的值; 它不能导致调用它的方法返回.它是否正确?如果是这种情况,我唯一能想到的就是foo
将另一个块作为参数调用,该参数在成功或操作失败时调用.这个问题是从'foo`上调调用堆栈,我将不得不改变任何返回类型的方法返回void并接受一个块作为调用的参数.必须改变所有这些方法似乎过分.我在概念上遗漏了什么吗?
我已经定义了这样一个数组:
ary = [[0,1], [2,3]]
Run Code Online (Sandbox Code Playgroud)
运行以下代码:
ary.reduce(nil) do |a, i, k|
puts "#{a.inspect} #{i.inspect} #{k.inspect}"
end
Run Code Online (Sandbox Code Playgroud)
在每次迭代中,我都期望变量a
,i
并且k
分别保持accumulator(nil
),第一个元素和内部数组的第二个元素的值,即我期望这个输出:
nil 0 1
nil 2 3
Run Code Online (Sandbox Code Playgroud)
但结果却是:
nil [0, 1] nil
nil [2, 3] nil
Run Code Online (Sandbox Code Playgroud)
为什么?我怎样才能达到我想要的效果?
此外,为什么下面的代码使用map
正如我所期望的那样?
ary.map do |i, k|
puts "#{i.inspect} #{k.inspect}"
end
# Output
# 0 1
# 2 3
Run Code Online (Sandbox Code Playgroud)
有什么不同?
我怀疑除非和ruby语言中的块.如果我愚蠢地问这个问题,请原谅.
让我们假设我们有两个布尔变量a = true
和b = true
.
条件:我想检查它们是否都是真的.使用if语句我们可以检查如下所示.
if a == true && b == true
print "Hai"
end
Run Code Online (Sandbox Code Playgroud)
怀疑:我可以使用下面给出的那个,而不是上面的陈述吗?
unless a == false && b == false
print "Hai"
end
Run Code Online (Sandbox Code Playgroud)
上面给出的两个块都会给出相同的结果吗?
当您调用外部.exe命令时,如何使PowerShell阻塞直到外部结束?
#include<iostream>
using namespace std;
int i=10;
int main()
{
int i=20;
cout<<i<<" "<<::i;
{
int i=30; //from here
cout<<endl<<i<<" "<<::i;
}
cout<<endl<<i<<" "<<::i<<endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出:
20 10
30 10
20 10
Run Code Online (Sandbox Code Playgroud)
在这里,我无法理解输出中'i'的最后一个值,为什么它不是30而不是30.
请看这里的评论,如果我替换int i = 30; 用I = 30; .
现在的输出是:
20 10
30 10
30 10
Run Code Online (Sandbox Code Playgroud)
为什么这里"i"的最后一个输出值相对于上面的代码而改变了.
最后一个最重要的问题是什么是使用块的应用?
下面的HTML/CSS结果让我觉得奇怪和意外,我真的在寻找解析它的方式背后的逻辑.
假设:
#nav {
list-style-type-none
}
#nav li {
display: inline;
}
/* make the LI's stack horizontally */
#nav li a {
display: block;
padding: 5px;
}
/* display as block to add padding */
Run Code Online (Sandbox Code Playgroud)
<ul id="nav">
<li><a href="#">Home</a>
</li>
<li><a href="#">About us</a>
</li>
</ul>
Run Code Online (Sandbox Code Playgroud)
这导致<li>
垂直堆叠(如块元素),因为<a>
它们显示为块元素.但我希望将<li>
它们水平堆叠,因为我已将它们定义为内联元素.
这些<li>
显示为内联,为什么内部元素<a>
会影响它?
我编写代码来了解如何在块中使用方法:
def block_trial alfa, &block
puts alfa
block.call
end
block_trial "Trial" do ||
puts "Komodo"
another_method
end
def another_method
puts "another_method"
end
Run Code Online (Sandbox Code Playgroud)
那种做法好吗?如何在块内使用其他方法?
这是我得到的错误:
block.rb:9:in `block in <main>': undefined local variable or method `another_method' for main:Object (NameError)
from block.rb:4:in `call'
from block.rb:4:in `block_trial'
from block.rb:7:in `<main>'
Run Code Online (Sandbox Code Playgroud) block ×10
ruby ×5
objective-c ×2
c++ ×1
css ×1
html ×1
inline ×1
ios ×1
iphone ×1
iterator ×1
output ×1
parameters ×1
powershell ×1