天道酬勤,学无止境

A method that applies self to a proc

I want to have a method defined on Object that takes a block and applies the receiver to the block. An implementation will be like the following:

class Object
    def apply ≺ pr.call(self) end
end

2.apply{|x| x * 3} # => 6

Is there already a standard way to do this or a well known library that has a method with similar use? If so, I didn't want to reinvent the wheel.

It happens to me very often that, I have a method that takes an optional block, and when there is no block, I want to return some return_value calculated within the method, but when there is a block, I want to return the return value of the return_value applied to the block. For now, I have bunches of lines like:

def method ..., &pr
  ...
  pr ? pr.call(return_value) : return_value
end

but I want to consistently write

def method ..., &pr
  ...
  pr ? return_value.apply(&pr) : return_value
end

or even better, with a slightly modified definition of apply,

def method ..., &pr
  ...
  return_value.apply(&pr)
end

评论

Is that not identical to def apply; yield self; end? – steenslag

@steenslag Yes. It is. I want to have that effect with self as the receiver. – sawa

Is this what you mean?

2.instance_eval { * 3 }
# => 6

Unfortunately, that doesn't work. instance_eval simply runs code as if the receiver was self. Operators don't presume self as the receiver, so you'd actually have to write this:

2.instance_eval { self * 3 }
# => 6

However, as a proof of concept, this is possible:

Numeric.send(:define_method, :plus) { |x| self + x }
2.instance_eval { plus 3 }
# => 5

(Aftwer reading OP's edit) AFAIK the canonical way to write this is:

def purpose(*args)  #no &bl or &pr
  res = 42 #huge calculation
  return res unless block_given?
  yield res
end

p purpose(1,2)
purpose{|n| puts "from the block: #{n}"}

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • to_proc方法是什么意思?(What does to_proc method mean?)
    问题 我正在学习Rails并遵循此主题。 我陷入to_proc方法。 我仅将符号视为字符串的替代方法(它们类似于字符串,但在内存方面更便宜)。 如果我还有其他缺少的符号,请告诉我。 请以简单的方式说明to_proc含义及其用途。 回答1 某些方法占用一个块,这种模式经常出现在一个块上: {|x| x.foo} 人们想以一种更简洁的方式写出来。 为此,他们使用以下各项的组合:符号,方法Symbol#to_proc ,隐式类转换和&运算符。 如果在参数位置将&放在Proc实例的前面,它将被解释为一个块。 如果将Proc实例之外的其他内容与& ,则隐式类转换将尝试使用在该对象上定义的to_proc方法(如果有)将其转换为Proc实例。 在Symbol实例的情况下, to_proc以这种方式工作: :foo.to_proc # => ->x{x.foo} 例如,假设您编写: bar(&:foo) &运算符与不是Proc实例的:foo结合使用,因此隐式类Symbol#to_proc转换对其应用Symbol#to_proc ,从而得到->x{x.foo} 。 &现在适用于此,并被解释为一个块,它给出: bar{|x| x.foo} 回答2 解释此问题的最简单方法是使用一些示例。 (1..3).collect(&:to_s) #=> ["1", "2", "3"] 是相同的: (1..3)
  • 多重处理:如何在类中定义的函数上使用Pool.map?(Multiprocessing: How to use Pool.map on a function defined in a class?)
    问题 当我运行类似的东西时: from multiprocessing import Pool p = Pool(5) def f(x): return x*x p.map(f, [1,2,3]) 它工作正常。 但是,将其作为类的函数: class calculate(object): def run(self): def f(x): return x*x p = Pool() return p.map(f, [1,2,3]) cl = calculate() print cl.run() 给我以下错误: Exception in thread Thread-1: Traceback (most recent call last): File "/sw/lib/python2.6/threading.py", line 532, in __bootstrap_inner self.run() File "/sw/lib/python2.6/threading.py", line 484, in run self.__target(*self.__args, **self.__kwargs) File "/sw/lib/python2.6/multiprocessing/pool.py", line 225, in _handle_tasks put(task)
  • map(&:name) 在 Ruby 中是什么意思?(What does map(&:name) mean in Ruby?)
    问题 我在 RailsCast 中找到了这段代码: def tag_names @tag_names || tags.map(&:name).join(' ') end 什么是(&:name)在map(&:name)是什么意思? 回答1 它是tags.map(&:name.to_proc).join(' ')的简写 如果foo是具有to_proc方法的对象,那么您可以将其作为&foo传递给方法,该方法将调用foo.to_proc并将其用作方法的块。 Symbol#to_proc方法最初由 ActiveSupport 添加,但已集成到 Ruby 1.8.7 中。 这是它的实现: class Symbol def to_proc Proc.new do |obj, *args| obj.send self, *args end end end 回答2 另一个很酷的速记,很多人都不知道,是 array.each(&method(:foo)) 这是一个简写 array.each { |element| foo(element) } 通过调用method(:foo)我们从self中获取了一个Method对象来表示它的foo方法,并使用&来表示它有一个to_proc方法可以将它转换成一个Proc 。 当你想做无点风格的事情时,这非常有用。 一个例子是检查数组中是否有任何字符串等于字符串"foo
  • 影响大量云服务厂商的严重漏洞:runC容器逃逸漏洞分析(CVE-2019-5736)
    41yf1sh 嘶吼专业版 一、概述以下漏洞研究的灵感来源于35C3 CTF的namespaces任务,由_tsuro创建。在进行这一挑战的过程中,我们发现,从安全角度来看,要创建基于命名空间的沙箱并通过外部进程加入是一项非常具有挑战性的任务。我们在CTF比赛结束后,发现Docker具有“docker exec”功能(实际上是由opencontainers的runc实现的)具有类似的模型,于是我们决定挑战这种漏洞实现。二、目标及结果我们的目标是在默认配置或加固后配置下的Docker容器内部攻陷宿主机环境(例如:获得有限的功能和系统调用可用性)。我们考虑了以下两个***维度:1、恶意Docker镜像;2、容器内的恶意进程(例如:攻陷以root身份运行的Docker化服务)。最终的结果,我们已经在宿主机上实现了完整意义的代码执行,具有所有功能(获得管理员“root”访问权限),该过程可以由以下任一方式触发:1、在被攻陷的Docker容器上,从宿主机运行“docker exec”;2、启动恶意Docker镜像。该漏洞被分配CVE编号CVE-2019-5736,并在这里正式公布:https://seclists.org/oss-sec/2019/q1/119三、默认Docker安全设置尽管Docker并没有作为沙盒软件发行,但它的默认设置会保护宿主机资源不被容器内的进程访问
  • 调用 celery 任务因延迟和 apply_async 而挂起(Calling celery task hangs for delay and apply_async)
    问题 我创建了一个具有以下目录结构的 celery 应用程序(如 celery 站点中所示): proj |-- celery.py |-- celery.pyc |-- __init__.py |-- __init__.pyc |-- tasks.py `-- tasks.pyc 以下是celery.py的内容 from __future__ import absolute_import from celery import Celery app = Celery('proj', broker='amqp://rabbitmquser:<my_passowrd>@localhost:5672/localvhost', #backend='amqp://', include=['proj.tasks']) # Optional configuration, see the application user guide. app.conf.update( CELERY_TASK_RESULT_EXPIRES=3600, ) if __name__ == '__main__': app.start() 以下是tasks.py的内容 from __future__ import absolute_import from proj.celery import app @app.task
  • Calling celery task hangs for delay and apply_async
    I have created a celery app with following directory structure (as given in celery site): proj |-- celery.py |-- celery.pyc |-- __init__.py |-- __init__.pyc |-- tasks.py `-- tasks.pyc Following are contents of celery.py from __future__ import absolute_import from celery import Celery app = Celery('proj', broker='amqp://rabbitmquser:<my_passowrd>@localhost:5672/localvhost', #backend='amqp://', include=['proj.tasks']) # Optional configuration, see the application user guide. app.conf.update( CELERY_TASK_RESULT_EXPIRES=3600, ) if __name__ == '__main__': app.start() Following is the content of
  • 将特定对象的方法作为 Tcl 中的输入参数传递(Pass a method of a specific object as an input argument in Tcl)
    问题 我正在编写一个 EDA 实用程序,依赖于符合 TCL 8.6 的 API。 我的挑战如下: 我的实用程序在数据库中的晶体管模型上运行,并使用 EDA 供应商的 TCL API 命令进行一些分析。 我可以将 TCL 过程名称/指针传递给 TCL 命令,并且分析将依赖于我的代码,而不是 EDA 供应商的代码。 内部编写的 proc 接受一个指向 EDA 供应商数据库中特定晶体管实例的指针作为参数。 现在,EDA 供应商允许使用 TCL 8.6,这意味着我想要传递而不是全局 proc 名称或命名空间 proc 名称,即特定对象名称的名称/指针。 我怎么做? 在代码示例中: oo:class create foo { constructor {} { variable numy 2 } method fooshta { mos_pointer } { puts "now in mosy [get name $mos_pointer ]" } destructor {} } foo create bar analyse_tx -proc < how do I refer to bar's method fooshta?> 在非 OOP 上下文中,代码如下所示: proc fooshta { mos_pointer } { puts "now in mosy [get name $mos
  • Ruby on Rails 3:通过Rails将数据流传输到客户端(Ruby on Rails 3: Streaming data through Rails to client)
    问题 我正在研究与RackSpace云文件(类似于Amazon S3,但缺少一些功能)进行通信的Ruby on Rails应用程序。 由于缺乏按对象访问权限和查询字符串身份验证的可用性,必须通过应用程序来介导对用户的下载。 在Rails 2.3中,看起来您可以动态构建一个响应,如下所示: # Streams about 180 MB of generated data to the browser. render :text => proc { |response, output| 10_000_000.times do |i| output.write("This is line #{i}\n") end } (来自http://api.rubyonrails.org/classes/ActionController/Base.html#M000464) 而不是10_000_000.times...我可以在其中转储我的cloudfiles流生成代码。 麻烦的是,这是我在Rails 3中尝试使用此技术时得到的输出。 #<Proc:0x000000010989a6e8@/Users/jderiksen/lt/lt-uber/site/app/controllers/prospect_uploads_controller.rb:75> 看起来proc对象的call方法可能没有被调用?
  • 如何恢复传递给multiprocessing.Process的函数的返回值?(How can I recover the return value of a function passed to multiprocessing.Process?)
    问题 在下面的示例代码中,我想恢复函数worker的返回值。 我该怎么做呢? 此值存储在哪里? 示例代码: import multiprocessing def worker(procnum): '''worker function''' print str(procnum) + ' represent!' return procnum if __name__ == '__main__': jobs = [] for i in range(5): p = multiprocessing.Process(target=worker, args=(i,)) jobs.append(p) p.start() for proc in jobs: proc.join() print jobs 输出: 0 represent! 1 represent! 2 represent! 3 represent! 4 represent! [<Process(Process-1, stopped)>, <Process(Process-2, stopped)>, <Process(Process-3, stopped)>, <Process(Process-4, stopped)>, <Process(Process-5, stopped)>] 我似乎无法找到存储在对象的相关属性jobs 。 回答1
  • Ruby:作为数组元素的方法——它们是如何工作的?(Ruby: methods as array elements - how do they work?)
    问题 这可能不是你应该在家里尝试的东西,但出于某种原因,我试图在 Ruby 中创建一个方法数组。 我首先定义了两种方法。 irb(main):001:0> def test1 irb(main):002:1> puts "test!" irb(main):003:1> end => nil irb(main):004:0> def test2 irb(main):005:1> puts "test2!" irb(main):006:1> end => nil 当您尝试将其放入实际数组时,会发生奇怪的事情。 它似乎运行这两种方法。 irb(main):007:0> array = [test1, test2] test! test2! => [nil, nil] 之后,数组为空。 irb(main):008:0> puts array => nil 有人可以向我解释为什么它运行这些方法吗? 除此之外,整个练习都非常需要驱魔师? 回答1 您在数组中存储的是调用方法的结果,而不是方法本身。 def test1 puts "foo!" end def test2 puts "bar!" end 您可以像这样存储对实际方法的引用: > arr = [method(:test1), method(:test2)] # => [#<Method: Object#test1>, #<Method
  • Ruby:将proc转换为lambda吗?(Ruby: convert proc to lambda?)
    问题 是否可以将proc风味的Proc转换为lambda风味的Proc? 有点惊讶,这至少在1.9.2中不起作用: my_proc = proc {|x| x} my_lambda = lambda &p my_lambda.lambda? # => false! 回答1 要追踪这个问题有些棘手。 在寻找Proc#lambda的文档? 对于1.9,关于proc和lamdba的区别进行了相当长的讨论。 结果是, lambda强制使用了正确数量的参数,而proc没有。 从该文档中,此示例显示了将proc转换为lambda的唯一方法: 即使给出了非lambda Proc对象, define_method始终定义没有技巧的方法。 这是不保留技巧的唯一例外。 class C define_method(:e, &proc {}) end C.new.e(1,2) => ArgumentError C.new.method(:e).to_proc.lambda? => true 如果要避免污染任何类,可以只在匿名对象上定义单例方法,以将proc强制为lambda : def convert_to_lambda &block obj = Object.new obj.define_singleton_method(:_, &block) return obj.method(:_).to_proc
  • Python无法使用multiprocessing.pool分配内存(Python cannot allocate memory using multiprocessing.pool)
    问题 我的代码(遗传优化算法的一部分)并行运行几个过程,等待所有过程完成,读取输出,然后使用其他输入重复执行。 当我进行60次重复测试时,一切工作正常。 由于它有效,所以我决定使用更实际的重复次数200。我收到此错误: File "/usr/lib/python2.7/threading.py", line 551, in __bootstrap_inner self.run() File "/usr/lib/python2.7/threading.py", line 504, in run self.__target(*self.__args, **self.__kwargs) File "/usr/lib/python2.7/multiprocessing/pool.py", line 302, in _handle_workers pool._maintain_pool() File "/usr/lib/python2.7/multiprocessing/pool.py", line 206, in _maintain_pool self._repopulate_pool() File "/usr/lib/python2.7/multiprocessing/pool.py", line 199, in _repopulate_pool w.start() File "/usr
  • 了解多处理:Python中的共享内存管理,锁和队列(Understanding Multiprocessing: Shared Memory Management, Locks and Queues in Python)
    问题 多重处理是python中的强大工具,我想更深入地了解它。 我想知道何时使用普通锁和队列,当使用多进程管理器中的所有进程共享这些。 我想出了以下测试了四种不同情况的场景多处理: 使用游泳池和NO经理使用一个游泳池和一个经理使用单独的流程和NO经理使用单独的流程和管理 工作 所有条件执行工作职能the_job 。 the_job包括一些印刷其通过锁固定的。 此外,输入到函数简单地放入队列(以查看它是否可以从队列中回收)。 该输入是一个简单的索引idx从range(10)在主脚本调用创建start_scenario (在底部示出)。 def the_job(args): """The job for multiprocessing. Prints some stuff secured by a lock and finally puts the input into a queue. """ idx = args[0] lock = args[1] queue=args[2] lock.acquire() print 'I' print 'was ' print 'here ' print '!!!!' print '1111' print 'einhundertelfzigelf\n' who= ' By run %d \n' % idx print who lock
  • [源码解析] 并行分布式任务队列 Celery 之 多进程模型
    Celery是一个简单、灵活且可靠的,处理大量消息的分布式系统,专注于实时处理的异步任务队列,同时也支持任务调度。因为 Celery 通过多进程来提高执行效率,所以本文将带领大家初步了解 Celery 之 多进程架构和模型。[源码解析] 并行分布式任务队列 Celery 之 多进程模型目录[源码解析] 并行分布式任务队列 Celery 之 多进程模型3.1 实例化3.2 建立通讯机制 queues3.3 进程池基类构造方法3.5 配置file 到 queue 的关系3.6 AsynPool 总体结果3.2.1 _SimpleQueue3.2.2 Pipe3.2.3 Connection3.3.1.1 子进程工作代码3.3.1.2 子进程抽象封装 --- WorkerProcess3.3.1.3 fork 过程3.3.1.2.1 WorkerProcess 具体执行3.3.1.2.2 基类 BaseProcess3.3.1.2.3 加入进程列表3.3.1 建立子进程3.4.2 辅助管理 Supervisor3.3.3 给子进程分配任务 ---- TaskHandler3.4.3 处理子进程返回 --- ResultHandler2.1 进程池初始化2.2 进程池启动 start1.1 bootsteps0x00 摘要0x01 Consumer 组件 Pool bootstep0x02
  • 是否可以在 Scheme 中“扩展”一个函数/lambda/宏?(Is it possible to “extend” a function / lambda / macro in Scheme?)
    问题 例如:如果我希望函数equal? 识别我自己的类型或记录,我可以添加一个新的equal?行为equal? ? 不擦除或覆盖旧的? 或者例如,如果我想让函数"+"也接受字符串? 回答1 与使用import ,更好的解决方案是通过let绑定来跟踪原始函数。 最好检查参数的类型是否是字符串,而不是它不是数字。 使用这两种方法意味着可以组合该技术。 (define + (let ((old+ +)) (lambda args (if (string? (car args)) (apply string-append args) (apply old+ args))))) (define + (let ((old+ +)) (lambda args (if (vector? (car args)) (apply vector-append args) (apply old+ args))))) 以上将产生一个+函数,适用于数字、字符串或向量。 一般来说,这是一种更具扩展性的方法。 我能够验证上述内容在 MIT/GNU Scheme、Guile、Racket、Chicken、TinyScheme 和 SCSH 中是否正常工作。 但是在一些实现中,比如Biwa Scheme,就需要使用set! 而不是define 。 在 Ikarus, set! 不能在导入的原语上使用
  • Python多处理:子进程崩溃?(Python Multiprocessing: Crash in subprocess?)
    问题 当python脚本打开子进程并且一个进程崩溃时,会发生什么? https://stackoverflow.com/a/18216437/311901 主进程会崩溃吗? 其他子进程会崩溃吗? 是否有传播的信号或其他事件? 回答1 当使用multiprocessing.Pool ,如果池中的一个子进程崩溃了,则将不会收到任何通知,并且将立即开始一个新的进程来代替它: >>> import multiprocessing >>> p = multiprocessing.Pool() >>> p._processes 4 >>> p._pool [<Process(PoolWorker-1, started daemon)>, <Process(PoolWorker-2, started daemon)>, <Process(PoolWorker-3, started daemon)>, <Process(PoolWorker-4, started daemon)>] >>> [proc.pid for proc in p._pool] [30760, 30761, 30762, 30763] 然后在另一个窗口中: dan@dantop:~$ kill 30763 回到泳池: >>> [proc.pid for proc in p._pool] [30760, 30761
  • [源码解析] 并行分布式任务队列 Celery 之 多进程架构和模型
    [源码解析] 并行分布式任务队列 Celery 之 多进程架构和模型 文章目录 [源码解析] 并行分布式任务队列 Celery 之 多进程架构和模型0x00 摘要0x01 Consumer 组件 Pool bootstep1.1 bootsteps 0x02 进程池入口 -- TaskPool2.1 进程池初始化2.2 进程池启动 start 0x03 进程池实现 -- AsynPool3.1 实例化3.2 建立通讯机制 queues3.2.1 _SimpleQueue3.2.2 Pipe3.2.3 Connection 3.3 进程池基类构造方法3.3.1 建立子进程3.3.1.1 子进程工作代码3.3.1.2 子进程抽象封装 --- WorkerProcess3.3.1.2.1 WorkerProcess 具体执行3.3.1.2.2 基类 BaseProcess3.3.1.2.3 加入进程列表 3.3.1.3 fork 过程 3.4.2 辅助管理 Supervisor3.3.3 给子进程分配任务 ---- TaskHandler3.4.3 处理子进程返回 --- ResultHandler 3.5 配置file 到 queue 的关系3.6 AsynPool 总体结果 0xFF 参考 0x00 摘要 Celery是一个简单、灵活且可靠的,处理大量消息的分布式系统
  • Similar errors in MultiProcessing. Mismatch number of arguments to function
    I couldn't find a better way to describe the error I'm facing, but this error seems to come up everytime I try to implement Multiprocessing to a loop call. I've used both sklearn.externals.joblib as well as multiprocessing.Process but error are similar though different. Original Loop on which want to apply Multiprocessing, where one iteration in executed in single thread/process for dd in final_col_dates: idx1 = final_col_dates.tolist().index(dd) dataObj = GetPrevDataByDate(d1, a, dd, self.start_hour_of_day) data2 = dataObj.fit() dataObj = GetAppointmentControlsSchedule(data2, idx1, d, final
  • `&method(:method_ name)` 在 ruby​​ 中是什么意思?(What does `&method(:method_ name)` mean in ruby?)
    问题 我试图创建一个具有私有类方法的类。 我希望这个私有类方法可以在实例方法中使用。 以下是我的第一次尝试: class Animal class << self def public_class_greeter(name) private_class_greeter(name) end private def private_class_greeter(name) puts "#{name} greets private class method" end end def public_instance_greeter(name) self.class.private_class_greeter(name) end end Animal.public_class_greeter('John')工作正常,打印John greets private class method 。 但是, Animal.new.public_instance_greeter("John")抛出一个错误: NoMethodError: private method 'private_class_greeter' called for Animal:Class 。 这是预期的,因为调用self.class.private_class_greeter与Animal.private_class
  • Python多进程池。 当工作进程之一确定不再需要执行更多工作时,如何退出脚本?(Python Multiprocess Pool. How to exit the script when one of the worker process determines no more work needs to be done?)
    问题 mp.set_start_method('spawn') total_count = Counter(0) pool = mp.Pool(initializer=init, initargs=(total_count,), processes=num_proc) pool.map(part_crack_helper, product(seed_str, repeat=4)) pool.close() pool.join() 所以我有一个工作人员池,可以完成一些工作。 它只需要找到一个解决方案。 因此,当一个工作进程找到解决方案时,我想停止一切。 我想到的一种方法是只调用sys.exit()。 但是,由于其他进程正在运行,因此似乎无法正常工作。 另一种方法是检查每个进程调用的返回值(part_crack_helper函数的返回值),然后在该进程上终止调用。 但是,我不知道在使用该map函数时该怎么做。 我应该如何实现呢? 回答1 您可以使用Pool.apply_async回调。 这样的事情应该可以为您完成工作。 from multiprocessing import Pool def part_crack_helper(args): solution = do_job(args) if solution: return True else: return False class