在Ruby 1.8中,proc/lambda与另一方面之间存在细微差别Proc.new
.
对于Fibers,我们有一个典型的例子:生成Fibonacci数
fib = Fiber.new do
x, y = 0, 1
loop do
Fiber.yield y
x,y = y,x+y
end
end
Run Code Online (Sandbox Code Playgroud)
为什么我们需要光纤呢?我可以用相同的Proc重写这个(实际上是闭包)
def clsr
x, y = 0, 1
Proc.new do
x, y = y, x + y
x
end
end
Run Code Online (Sandbox Code Playgroud)
所以
10.times { puts fib.resume }
Run Code Online (Sandbox Code Playgroud)
和
prc = clsr
10.times { puts prc.call }
Run Code Online (Sandbox Code Playgroud)
将返回相同的结果.
那么纤维有什么优点呢?我可以用Fibers写什么样的东西我不能用lambdas和其他很酷的Ruby功能?
我正在学习rails并遵循这个主题.我坚持使用这种to_proc
方法.我认为符号只是字符串的替代品(它们就像字符串,但在内存方面更便宜).如果还有其他我想念的符号,那么请告诉我.请以简单的方式解释什么to_proc
方法和用途.
在遇到DDOS攻击之后,不知何故/proc/kcore
非常巨大,我使用一个小的PHP类来检查当前的磁盘空间,以及已经使用了多少.
它显示以下内容:
Total Disk Space: 39.2 GB
Used Disk Space: 98 GB
Free Disk Space: 811.6 MB
Run Code Online (Sandbox Code Playgroud)
我的问题是,删除/proc/kcore
文件是否安全?或者有一个解决方案,使其达到正常大小.
文件大小/proc/kcore
为140.737.486.266.368字节
我在DigitalOcean托管了我的服务器.
如果需要了解更多信息,请询问;)
非常感谢!
编辑...
df -h
收益:
Filesystem Size Used Avail Use% Mounted on
/dev/vda 40G 37G 755M 99% /
udev 993M 12K 993M 1% /dev
tmpfs 401M 224K 401M 1% /run
none 5.0M 0 5.0M 0% /run/lock
none 1002M 0 1002M 0% /run/shm
Run Code Online (Sandbox Code Playgroud)
du -shx
收益:
du -shx *
8.7M bin
27M boot
12K …
Run Code Online (Sandbox Code Playgroud) 我想在要重用的变量中存储"代码块",例如:
block = do
|test| puts test
end
3.upto(8) block
Run Code Online (Sandbox Code Playgroud)
有人能告诉我我在做什么这么显然是错的吗?(或者,如果这是不可能的)
我注意到很多处理Ruby Procs的例子都有以下&符号.
# Ruby Example
shout = Proc.new { puts 'Yolo!' }
def shout_n_times(n, &callback)
n.times do
callback.call
end
end
shout_n_times(3, &shout)
# prints 'Yolo!' 3 times
Run Code Online (Sandbox Code Playgroud)
我的问题是&符号背后的功能目的是什么?似乎如果我没有&编写相同的确切代码,它按预期工作:
# Same code as previous without &
shout = Proc.new { puts 'Yolo!' }
def shout_n_times(n, callback)
n.times do
callback.call
end
end
shout_n_times(3, shout)
# prints 'Yolo!' 3 times
Run Code Online (Sandbox Code Playgroud) 如何Proc#==
评估?RDoc说:
prc == other_proc→true或false
如果prc与other_proc是同一个对象,或者它们都是具有相同主体的proc,则返回true.
但目前尚不清楚什么算是"同一个身体".一个条件似乎是arity必须是相同的:
->{} == ->{} # => true
->{} == ->x{} # => false
->x{} == ->x{} # => true
->x{} == ->y{} # => true
->x{} == ->y,z{} # => false
Run Code Online (Sandbox Code Playgroud)
但还有更多.正如RDoc所说,身体很重要:
->{nil} == ->{nil} # => true
->{nil} == ->{false} # => false
->{false} == ->{false} # => true
Run Code Online (Sandbox Code Playgroud)
但与此同时,看起来proc尚未得到充分评估:
->{} == ->{nil} # => false
->{false} == ->{1 == 2} # => false
Run Code Online (Sandbox Code Playgroud)
身体评估的程度如何?
str = "<a><b><c></c></b></a>"
hash = Hash.from_xml(str)
# => {"a"=>{"b"=>{"c"=>nil}}}
Run Code Online (Sandbox Code Playgroud)
如何替换nil
哈希中的所有s以""
使哈希变为:
{"a"=>{"b"=>{"c"=>""}}}
Run Code Online (Sandbox Code Playgroud) 我发现了一个有趣但无法解释的替代方案.代码清楚地在REPL中起作用.例如:
module Foo
class Bar
def baz
end
end
end
Foo.constants.map(&Foo.method(:const_get)).grep(Class)
=> [Foo::Bar]
Run Code Online (Sandbox Code Playgroud)
但是,我并不完全理解这里使用的习语.特别是,我不理解使用&Foo
,这似乎是某种闭包,或者#grep的这种特定调用如何对结果进行操作.
到目前为止,我已经能够解析这部分内容了,但我并没有真正看到它们是如何组合在一起的.以下是我认为我对示例代码的理解.
Foo.constants
返回模块常量数组作为符号.
method(:const_get)
使用Object#方法执行方法查找并返回闭包.
Foo.method(:const_get).call :Bar
是一个闭包,它返回类中常量的限定路径.
&Foo
似乎是某种特殊的lambda.文档说:
如果Proc对象由&参数给出,&参数将保留技巧.
我不确定我是否完全理解这在特定背景下的含义.为什么选择Proc?什么"诡计",为什么这里有必要?
grep(Class)
正在运行#map方法的值,但其功能并不明显.
为什么这个#map构造返回一个greppable Array而不是Enumerator?
Foo.constants.map(&Foo.method(:const_get)).class
=> Array
Run Code Online (Sandbox Code Playgroud)如何为一个名为Class的类的grepping实际工作,为什么这里需要特定的构造?
[Foo::Bar].grep Class
=> [Foo::Bar]
Run Code Online (Sandbox Code Playgroud)我真的很想完全理解这个成语.任何人都可以在这里填补空白,并解释这些部分是如何组合在一起的吗?
如何知道我所处的过程的名称是什么.我的意思是我需要这个:
proc nameOfTheProc {} {
#a lot of code here
puts "ERROR: You are using 'nameOfTheProc' proc wrongly"
}
Run Code Online (Sandbox Code Playgroud)
所以我想获得"nameOfTheProc"但不是硬代码.因此,当有人更改proc名称时,它仍然可以正常工作.