gpt4 book ai didi

ruby - 在 Ruby 中如何知道 Proc 是不是 lambda

转载 作者:数据小太阳 更新时间:2023-10-29 07:52:29 27 4
gpt4 key购买 nike

假设我创建了一个 lambda 实例,稍后我想查询该对象以查看它是 proc 还是 lambda。如何做到这一点? .class() 方法不起作用。

irb(main):001:0> k = lambda{ |x| x.to_i() +1 }
=> #<Proc:0x00002b931948e590@(irb):1>
irb(main):002:0> k.class()
=> Proc

最佳答案

Ruby 1.9.3 及更高版本

您正在寻找Proc#lambda?方法。

k = lambda { |x| x.to_i + 1 }
k.lambda? #=> true
k = proc { |x| x.to_i + 1 }
k.lambda? #=> false

1.9.3 之前的解决方案

我们将制作 ruby​​ 原生扩展。使用以下内容创建 proc_lambda/proc_lambda.c 文件。

#include <ruby.h>
#include <node.h>
#include <env.h>


/* defined so at eval.c */
#define BLOCK_LAMBDA 2
struct BLOCK {
NODE *var;
NODE *body;
VALUE self;
struct FRAME frame;
struct SCOPE *scope;
VALUE klass;
NODE *cref;
int iter;
int vmode;
int flags;
int uniq;
struct RVarmap *dyna_vars;
VALUE orig_thread;
VALUE wrapper;
VALUE block_obj;
struct BLOCK *outer;
struct BLOCK *prev;
};

/* the way of checking if flag is set I took from proc_invoke function at eval.c */
VALUE is_lambda(VALUE self)
{
struct BLOCK *data;
Data_Get_Struct(self, struct BLOCK, data);
return (data->flags & BLOCK_LAMBDA) ? Qtrue : Qfalse;
}

void Init_proc_lambda()
{
/* getting Proc class */
ID proc_id = rb_intern("Proc");
VALUE proc = rb_const_get(rb_cObject, proc_id);

/* extending Proc with lambda? method */
rb_define_method(proc, "lambda?", is_lambda, 0);
}

创建 proc_lambda/extconf.rb 文件:

require 'mkmf'
create_makefile('proc_lambda')

在终端 cd 到 proc_lambda 并运行

$ ruby extconf.rb
$ make && make install

在 irb 中测试

irb(main):001:0> require 'proc_lambda'
=> true
irb(main):002:0> lambda {}.lambda?
=> true
irb(main):003:0> Proc.new {}.lambda?
=> false

关于ruby - 在 Ruby 中如何知道 Proc 是不是 lambda,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28581642/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com