Ruby中的块是什么意思?它与Smalltalk看起来类似,但您无法向其发送消息.
例如,在smalltalk中:
[:x | x + 3] value: 3
Run Code Online (Sandbox Code Playgroud)
返回6.但是在红宝石中:
{|x| x + 3}.call 3
Run Code Online (Sandbox Code Playgroud)
将导致SyntaxError.
好吧,你可以在ruby中将消息传递给lambda:
irb(main):025:0> ->(x){x+3}.call 3
=> 6
Run Code Online (Sandbox Code Playgroud)
所以在Ruby中,块不是一个块,但lambda是一个块?这是真的?我的意思是,红宝石lambda和smalltalk块之间有什么区别吗?如果这是真的,那么什么是红宝石块呢?
更新:
从下面的评论和答案,以及一些谷歌搜索,我想我对Ruby块有了更多的了解.在Ruby中,通常一段代码会计算一个值,而每个值都是一个对象.但是,块不会评估值.所以这不是一个对象.相反,它可以作为对象的一部分.例如,在{| x |中 x + 3}可以作为对象proc {| x |的一部分 x + 3}.
但它确实让我困惑.在smalltalk中,几乎每个表达式都可以分为对象(绑定到变量是例外).在Ruby中似乎有更多例外.
在C#中,您可以在未附加到任何其他语句的方法中创建块.
public void TestMethod()
{
{
string x = "test";
string y = x;
{
int z = 42;
int zz = z;
}
}
}
Run Code Online (Sandbox Code Playgroud)
此代码编译并运行,就像主方法中的大括号不存在一样.还要注意块内部的块.
有没有这种情况有价值?我还没有找到,但我很想知道其他人的发现.
我们的客户想知道谁在线并且目前正在使用我们为他们编写的自定义应用程序.我和他们讨论过这个问题并不一定非常准确,更多的猜测会起作用.
所以我的想法是15分钟的时间间隔来确定用户活动.我这样做的一些想法如下:
每次他们做一些击中数据库的事情时,用他们最后一次活动的日期和时间标记他们的用户记录,或者请求一个网页......这虽然可能是数据库密集型的.
从我们的软件发出"谁是在线请求",寻找响应,这可以按计划的时间间隔完成,然后在用户记录上标记我收到的每个响应的当前日期和时间.
你的想法是什么?你会如何处理这种情况?
澄清
如果可能的话,我想在Windows或Web上使用相同的架构.我有一个业务逻辑层,多个用户界面可以与之交互,可以是Windows或Web.
通过Windows,我的意思是客户端 - 服务器.
澄清
我使用的是n层架构,因此我的业务对象处理与表示层的所有交互.该表示层可以提供客户端 - 服务器Windows应用程序,Web应用程序,Web服务等.
它不是一个高流量的应用程序,因为它是为我们的客户开发的,最多可能有100个用户.
假设我有一个bzip2文件(超过5GB),我只想解压缩块#x,因为我的数据就在哪里(块每次都不同).我该怎么做?
我想要制作一个所有块所在的索引,然后从文件中剪切我需要的块并将bzip2recover应用于它.
我还考虑过一次压缩1MB,然后将其附加到文件(并记录位置),并在需要时简单地抓取文件,但我宁愿保持原始的bzip2文件完好无损.
我的首选语言是Ruby,但任何语言的解决方案都很好(只要我理解原理).
是否有可能为一lambda,proc,method或其他类型的宝石块,以获得到另一个块?
就像是...
a = lambda {
puts 'in a'
yield if block_given?
}
a.call { puts "in a's block" }
Run Code Online (Sandbox Code Playgroud)
这不起作用......它只是产生
in a
=> nil
Run Code Online (Sandbox Code Playgroud)
有没有办法让块调用一个块?
我正在用C#做一个在线测验项目.测试客户端是在Windows XP上运行的Windows桌面应用程序.我需要阻止control+ alt+ delete组合键以防止学生最小化/关闭应用程序.
使用PInvoke对我来说没问题.
我知道这肯定是可能的,因为我看到有三个应用程序这样做.它们都是专有的,所以我无法知道它是如何完成的.
我将以一个例子解释我的问题.我们在C#中有以下代码:
void A(Action block)
{
B(() =>
{
Console.WriteLine(2);
block();
});
}
void B(Action block)
{
Console.WriteLine(1);
block();
}
void Main()
{
A(() =>
{
Console.WriteLine(3);
});
}
Run Code Online (Sandbox Code Playgroud)
此代码的输出是:
1
2
3
Run Code Online (Sandbox Code Playgroud)
现在,我想在PowerShell中编写此代码:
function A($block) {
B {
2
. $block
}
}
function B($block) {
1
. $block
}
A {
3
}
Run Code Online (Sandbox Code Playgroud)
但是,此代码会导致调用深度溢出:
由于调用深度溢出,脚本失败.呼叫深度达到1001,最大值为1000.
我发现如果我更改函数B的参数名称,它将起作用.
它是一个功能还是一个错误(或两者兼而有之)?如何在PowerShell中完成这项工作,而不需要在函数中使用唯一的参数?
我需要模拟Fluxbox窗口管理器的窗口放置策略.
作为一个粗略的指南,可视化随机大小的窗口一次一个地填满屏幕,其中每个窗口的粗略大小导致屏幕上平均80个窗口,而没有任何窗口与另一个窗口重叠.
如果您的系统上安装了Fluxbox和Xterm,您可以尝试使用xwinmidiarptoy BASH脚本来查看我想要发生的事情的粗略原型.请参阅我写过的xwinmidiarptoy.txt说明,解释它的作用以及如何使用它.
重要的是要注意窗口将关闭,并且关闭先前占用的窗口的空间再次可用于放置新窗口.
该算法需要是一个在线算法处理数据"以串行方式逐个处理,即按照输入被提供给算法的顺序,而不需要从一开始就提供整个输入."
Fluxbox窗口放置策略有三个我想模拟的二元选项:
Windows构建水平行或垂直列(可能)
Windows从左到右或从右到左放置
Windows从上到下或从下到上放置
目标算法与窗口放置算法之间的差异
坐标单位不是像素.将放置块的网格将是128 x 128个单位.此外,放置区域可以通过放置在网格内的边界区域进一步收缩.
为什么算法有问题?
它需要在音频应用程序中运行到实时线程的最后期限.
此刻我只关心获得快速算法,不关心实时线程的含义以及编程带来的所有障碍.
虽然算法永远不会放置一个与另一个重叠的窗口,但是用户将能够放置和移动某些类型的块,将存在重叠的窗口.用于存储窗口和/或空闲空间的数据结构需要能够处理这种重叠.
到目前为止,我有两个选择,我已经建立了松散的原型:
1)Fluxbox放置算法的一个端口到我的代码中.
问题是,当我尝试使用该算法放置256块的最坏情况时,客户端(我的程序)被踢出音频服务器(JACK).该算法在放置第256个窗口时对已经放置的块列表执行超过14000次完整(线性)扫描.
为了演示这一点,我创建了一个名为text_boxer-0.0.2.tar.bz2的程序,该程序将文本文件作为输入并将其排列在ASCII框中.问题make来构建它.有点不友好,使用--help(或任何其他无效选项)的命令行选项列表.您必须使用该选项指定文本文件.
2)我的替代方法.
仅部分实现,该方法对矩形空闲未使用空间的每个区域使用数据结构(窗口列表可以完全分离,并且不需要用于测试该算法).数据结构充当双向链表中的节点(具有排序插入),并且包含左上角的坐标以及宽度和高度.
此外,每个块数据结构还包含四个链接,这四个链接连接到四个边中的每一个上的每个紧邻(触摸)块.
重要规则:每个块每侧只能触摸一个块.这是一种特定于算法存储空闲未使用空间的方法的规则,并且不会影响实际窗口可能相互接触的数量.
这种方法的问题是,它非常复杂.我已经实现了直接的情况,其中1)从块的一个角去除空间,2)分割相邻的块以便遵守重要的规则.
不太直接的情况,其中要移除的空间只能在一列或一排框中找到,只是部分实现 - 如果要移除的一个块完全适合宽度(即列)或高度(即然后出现问题.甚至没有提到这个事实,它只检查一个框宽的列,并排一个框高.
我已经用C语言实现了这个算法 - 我正在使用这个项目的语言(我几年没有使用过C++,在把注意力都集中在C开发之后使用它很不舒服,这是一个爱好).实现是700多行代码(包括大量空行,支撑线,注释等).该实现仅适用于水平行+左右+上下放置策略.
所以我要么添加一些方法来使这些+700行代码适用于其他7个放置策略选项,或者我将不得不为其他7个选项复制那些+700行代码.这些都不具吸引力,第一,因为现有代码足够复杂,第二,因为膨胀.
由于缺少功能,该算法甚至不能在实时最坏情况下使用它,因此我仍然不知道它实际上是否比第一种方法更好或更差.
该算法的C实现的当前状态是freespace.c.我用它gcc -O0 -ggdb freespace.c来构建,并以xterm大小运行它至少至少124 x 60个字符.
那里还有什么?
我撇去并打折: …
我提取了简单的例子:
require 'pp'
x = 1..3
pp x.map do |i| {:value => i, :double => (i*2)} end
pp x.map { |i| {:value => i, :double => (i*2)} }
pp(x.map do |i| {:value => i, :double => (i*2)} end)
pp(x.map { |i| {:value => i, :double => (i*2)} })
Run Code Online (Sandbox Code Playgroud)
我想知道为什么第一个pp产生:
[1, 2, 3]
Run Code Online (Sandbox Code Playgroud)
所有的演讲者都在给予:
[{:value=>1, :double=>2}, {:value=>2, :double=>4}, {:value=>3, :double=>6}]
Run Code Online (Sandbox Code Playgroud)
我认为它与运算符优先级有关.我在哪里可以找到好的解释?
在Mac OS X和iOS中学习块和GCD有哪些很好的建议资源
c# ×3
ruby ×3
.net ×2
algorithm ×1
archive ×1
bisection ×1
bzip ×1
bzip2 ×1
cocoa ×1
compression ×1
database ×1
lambda ×1
objective-c ×1
packing ×1
parameters ×1
parentheses ×1
powershell ×1
smalltalk ×1
user-input ×1