Procs和lambdas 在方法范围和关键字的影响方面有所不同return.我对它们之间的性能差异很感兴趣.我写了一个测试,如下所示:
def time(&block)
start = Time.now
block.call
p "that took #{Time.now - start}"
end
def test(proc)
time{(0..10000000).each{|n| proc.call(n)}}
end
def test_block(&block)
time{(0..10000000).each{|n| block.call(n)}}
end
def method_test
time{(1..10000000).each{|n| my_method(n)}}
end
proc1 = Proc.new{|x| x*x}
proc2 = proc{|x| x*x}
lam1 = lambda{|x| x*x}
lam2 = ->x{x*x}
def my_method(x)
x*x
end
test(proc1)
test(proc2)
test(lam1)
test(lam2)
test_block{|x| x*x}
test(method(:my_method))
method_test
Run Code Online (Sandbox Code Playgroud)
此代码的结果如下所示.
"that took 0.988388739"
"that took 0.963193172"
"that took 0.943111226"
"that took 0.950506263"
"that took 0.960760843"
"that took 1.090146951"
"that …Run Code Online (Sandbox Code Playgroud) 我想监视我的NFS共享的IO.有很多程序正在解释/proc/[id]/mountstats([id] = nfs客户端/服务器的id)或/proc/self/mountstats.问题是,这些程序每秒计算一些IO.这在命令行中非常好用,但对我的监控解决方案来说却毫无用处.所以我想解释mountstats自己的反击.我现在的问题是,我需要一些mountstats针对nfs v4的文档.
到目前为止,我的搜索没有提出任何有用的.
谢谢你的帮助
Ubuntu(nfs客户端)上/ proc/self/mountstats的示例输出:
...
device IPADRESS:/mountpoint mounted on /mnt/mountpoint with fstype nfs4 statvers=1.0
opts: rw,vers=4,rsize=1048576,wsize=1048576,acregmin=3,acregmax=60,acdirmin=30,acdirmax=60,hard,nointr,proto=tcp,timeo=600,retrans=2,sec=sys
age: 77663
caps: caps=0x1e,wtmult=512,dtsize=4096,bsize=0,namelen=255
nfsv4: bm0=0xfdffbfff,bm1=0xf9be3e,acl=0x3
sec: flavor=1,pseudoflavor=1
events: 1462723 25756220 1025148 1164028 1083099 2027020 31347107 1984730 279773 1915700 1346583 21077199 520498 31825 525298 39026 2180470 1083041 0 16822 990144 11011 0 0 0
bytes: 46686144592 3990939437 0 0 30238687174 3759616491 7739053 1346583
RPC iostats version: 1.0 p/v: 100003/4 (nfs)
xprt: tcp …Run Code Online (Sandbox Code Playgroud) 如下面的ruby示例所示,我不能lambda使用Proc从a创建的错误数量的参数调用,Method因为它对参数的数量是严格的:
# method with no args
def a; end
instance_eval(&method(:a))
# ArgumentError: wrong number of arguments (1 for 0)
method(:a).to_proc.call(1, 2, 3)
# ArgumentError: wrong number of arguments (3 for 0)
method(:a).to_proc.lambda?
# => true
Run Code Online (Sandbox Code Playgroud)
我如何得到一个Proc不是来自一个Proc或来自一个lambda的lambda Method?
我想知道最近收到的路由器广告的m标志和o标志的值.从内核源代码我知道存储了m标志和o标志.
/*
* Remember the managed/otherconf flags from most recently
* received RA message (RFC 2462) -- yoshfuji
*/
in6_dev->if_flags = (in6_dev->if_flags & ~(IF_RA_MANAGED |
IF_RA_OTHERCONF)) |
(ra_msg->icmph.icmp6_addrconf_managed ?
IF_RA_MANAGED : 0) |
(ra_msg->icmph.icmp6_addrconf_other ?
IF_RA_OTHERCONF : 0);
.
.
.
Run Code Online (Sandbox Code Playgroud)
然后我相信必须能够使用ioctl或proc文件系统或任何其他方法检索这些值.任何人都可以指出这一点.
为什么Ruby(2.0)使用splat参数处理/块的行为与方法和lambda不同?
def foo (ids, *args)
p ids
end
foo([1,2,3]) # => [1, 2, 3]
bar = lambda do |ids, *args|
p ids
end
bar.call([1,2,3]) # => [1, 2, 3]
baz = proc do |ids, *args|
p ids
end
baz.call([1,2,3]) # => 1
def qux (ids, *args)
yield ids, *args
end
qux([1,2,3]) { |ids, *args| p ids } # => 1
Run Code Online (Sandbox Code Playgroud)
以下是对此行为的确认,但没有解释:http: //makandracards.com/makandra/20641-careful-when-calling-a-ruby-block-with-an-array
我一直在将Ruby代码转换为Python代码,现在我坚持使用包含以下内容的函数yield:
def three_print():
yield
yield
yield
Run Code Online (Sandbox Code Playgroud)
我想调用该函数并告诉它打印"Hello"三次,因为这三个yield语句.由于函数不接受任何参数,我得到一个错误.你能告诉我最简单的方法吗?谢谢.
从下面的消息中,我们知道文件/ proc/sys/net/ipv4/ip_forward中有两个字符,但为什么ls只是显示这个文件的大小为零?
我知道这不是磁盘上的文件,而是内存中的文件,所以有没有命令可以看到/ proc中文件的实际大小?
root@OpenWrt:/proc/sys/net/ipv4# cat ip_forward | wc -c
2
root@OpenWrt:/proc/sys/net/ipv4# ls -l ip_forward
-rw-r--r-- 1 root root 0 Sep 3 00:20 ip_forward
root@OpenWrt:/proc/sys/net/ipv4# pwd
/proc/sys/net/ipv4
Run Code Online (Sandbox Code Playgroud) 有没有办法"打开"使用Proc.new或实例化的Proc的严格的arity强制执行Kernel.proc,以便它的行为类似于Proc实例化的lambda?
My initialize method takes a block &action and assigns it to an instance variable. I want action to strictly enforce arity, so when I apply arguments to it later on, it raises an ArgumentError that I can rescue and raise a more meaningful exception. Basically:
class Command
attr_reader :name, :action
def initialize(name, &action)
@name = name
@action = action
end
def perform(*args)
begin
action.call(*args)
rescue ArgumentError
raise(WrongArity.new(args.size))
end
end
end
class WrongArity < …Run Code Online (Sandbox Code Playgroud) 您好,我需要有关具有某些 PID 的进程的以下信息:
名称、ppid、状态、#ofOpenFiles、#ofThreads
我知道 /proc/pid/stat 文件的示例如下:
15(看门狗/1) S 2 0 0 0 -1 69239104 0 0 0 0 0 69 0 0 -100 0 1 0 6 0 0 18446744073709551615 0 0 0 0 0 0 0 2147483647 0 1844674407370 9551615 0 0 17 1 99 1 0 0 0 0 0 0 0 0 0 0 0
我当前尝试解析此类文件:
FILE *fp;
char buff[255];
fp= fopen("/proc/123/stat", "r");
if(fp == NULL){
}else{
fscanf(fp, "%d %s %c %d %d %d %d %d …Run Code Online (Sandbox Code Playgroud) 众所周知,Rubyist &会调用to_proc一个符号,所以
[:a, :b, :c].map(&:to_s)
Run Code Online (Sandbox Code Playgroud)
相当于
[:a, :b, :c].map { |e| e.to_s } # => ["a", "b", "c"]
Run Code Online (Sandbox Code Playgroud)
假设我想立即调用另一个方法to_s,这两个实现将起作用:
[:a, :b, :c].map { |e| e.to_s.upcase }
[:a, :b, :c].map(&:to_s).map(&:upcase)
Run Code Online (Sandbox Code Playgroud)
我的问题是,有没有办法& Symbol#to_proc在一个参数中链接调用?就像是:
[:a, :b, :c].map(&:to_s:upcase)
Run Code Online (Sandbox Code Playgroud)
谢谢!