小编Jan*_*net的帖子

如何实现Perl中的map函数?

mapPerl中的函数是用Perl编写的吗?我只是无法弄清楚如何实现它.这是我的尝试:

use Data::Dumper;

sub Map {
    my ($function, $sequence) = @_;

    my @result;
    foreach my $item (@$sequence) {
        my $_ = $item;
        push @result, $function->($item);
    }
    return @result
}

my @sample = qw(1 2 3 4 5);
print Dumper Map(sub { $_ * $_ }, \@sample);
print Dumper map({ $_ * $_ } @sample);
Run Code Online (Sandbox Code Playgroud)

$_in $function是未定义的,但是如何map克服这个?

perl map

3
推荐指数
2
解决办法
1207
查看次数

静态变量是否会耗尽内存?

基于这个讨论,我想知道函数作用域静态变量是否总是使用内存,或者是否允许编译器对其进行优化.为了说明这个问题,假设一个这样的函数:

void f() {
   static const int i = 3;
   int j = i + 1;
   printf("%d", j);
}
Run Code Online (Sandbox Code Playgroud)

编译器很可能i3 + 1在编译时内联函数并可能进行计算.由于这是i使用值的唯一位置,因此不需要分配任何静态内存.那么编译器是允许优化静态的,还是标准要求任何静态变量都分配了内存?

c++ static compiler-optimization

3
推荐指数
2
解决办法
403
查看次数

使用static_cast(或reinterpret_cast)进行无效向下转换的安全性,无需添加成员即可继承

我想知道标准对以下代码的安全性的说法:

class A { int v; };
class B: public A { }; // no added data member

A a;
B& b = static_cast<B&>(a);
Run Code Online (Sandbox Code Playgroud)

显然的运行时类型aA,不是B,所以剧组是不是真的类型安全的.但是,由于没有添加任何成员而且没有任何内容是虚拟的,IMO的类的内存布局应该是相同的,这应该可行(可能写入更好reinterpret_cast以表明这种行为?).我的猜测是这是UB,但适用于任何编译器.或者这实际上定义得很好?还是比较危险?

此外,如果B有一些额外的非虚拟成员方法会有什么变化吗?再一次,直觉上我会说不,但我想知道标准对此有何看法.

c++ casting downcast static-cast reinterpret-cast

3
推荐指数
1
解决办法
611
查看次数

在Perl中正确转发返回值

我对Perl很陌生,并且很难将其包裹在非常隐含的类型系统中.我想要实现的是一个简单的包装函数,它与它包装的函数具有相同的签名,因此可以在它的位置使用它.

所以,假设我有一个orig我想要包装的现有函数.我接受了许多输入参数,并根据这些参数具有不同的返回类型.只要我按以下方式编写包装器,返回类型与原始函数相同,它们都可以正常工作:

sub wrapper {
    my ($first) = @_;
    print "before. first argument: $first\n";
    return orig(@_);
}
Run Code Online (Sandbox Code Playgroud)

但是,如果我想在执行之后在包装器中执行一些代码,orig我不知道如何保留类型.根据我的理解,对perl函数的输入始终是一个标量数组,输出也是如此.所以解决方案应该是这样的:

sub wrapper {
    my ($first) = @_;
    print "before. first argument: $first\n";
    my @result = orig(@_);
    print "after";
    return @result;
}
Run Code Online (Sandbox Code Playgroud)

但这似乎并没有像预期的那样奏效.我错过了什么?如何编写这样的包装函数,它适用于任意返回类型?

perl return-type

3
推荐指数
1
解决办法
112
查看次数

理解彼此跟随的setTimeout()函数的执行

我需要以固定的时间间隔一个接一个地执行多个函数,因此使用setTimeout.我想确保我理解它是如何执行的.我有以下逻辑:

setTimeout(function() {
  //Execute first function
}, 200);

setTimeout(function() {
  //Execute second function
}, 400);

setTimeout(function() {
  //Execute third function
}, 600);
Run Code Online (Sandbox Code Playgroud)

这是否意味着第一个函数在200ms之后执行,第二个函数在第一个函数执行后200ms,第三个函数在第二个函数之后200ms执行,依此类推?或者我需要改变一些东西.

javascript execution settimeout

2
推荐指数
1
解决办法
518
查看次数