标签: lambda

函数返回lambda表达式

我想知道是否可以在C++ 11中编写一个返回lambda函数的函数.当然一个问题是如何声明这样的功能.每个lambda都有一个类型,但是这种类型在C++中是不可表达的.我不认为这会奏效:

auto retFun() -> decltype ([](int x) -> int)
{
    return [](int x) { return x; }
}
Run Code Online (Sandbox Code Playgroud)

这不是:

int(int) retFun();
Run Code Online (Sandbox Code Playgroud)

我不知道从lambdas到函数指针或类似函数的任何自动转换.手工制作函数对象并返回它的唯一解决方案是什么?

c++ lambda function c++11

85
推荐指数
4
解决办法
3万
查看次数

函数指针,闭包和Lambda

我刚才正在学习函数指针,当我正在阅读关于这个主题的K&R章节时,第一件让我感到惊讶的是,"嘿,这有点像一个闭包." 我知道这种假设在某种程度上是根本错误的,在网上搜索后我没有找到任何对这种比较的分析.

那么为什么C风格的函数指针与闭包或lambdas根本不同呢?据我所知,它与函数指针仍然指向已定义(命名)函数的事实有关,这与匿名定义函数的做法相反.

为什么将函数传递给在第二种情况下看起来更强大的函数,它是未命名的,而不是第一种传递的正常日常函数?

请告诉我如何以及为什么我错误地比较这两者.

谢谢.

c lisp lambda computer-science closures

84
推荐指数
4
解决办法
3万
查看次数

在Ruby块中使用'return'

我正在尝试将Ruby 1.9.1用于嵌入式脚本语言,以便"最终用户"代码在Ruby块中编写.这个问题的一个问题是我希望用户能够在块中使用'return'关键字,因此他们不需要担心隐式返回值.考虑到这一点,这是我希望能够做到的事情:

def thing(*args, &block)
  value = block.call
  puts "value=#{value}"
end

thing {
  return 6 * 7
}
Run Code Online (Sandbox Code Playgroud)

如果我在上面的例子中使用'return',我会得到一个LocalJumpError.我知道这是因为有问题的块是Proc而不是lambda.如果我删除'return',代码就可以工作,但我真的更喜欢在这种情况下使用'return'.这可能吗?我已经尝试将块转换为lambda,但结果是一样的.

ruby lambda return proc-object

83
推荐指数
3
解决办法
5万
查看次数

为什么我不能在C++ 11中创建lambdas(相同类型)的向量?

我试图创建一个lambda矢量,但失败了:

auto ignore = [&]() { return 10; };  //1
std::vector<decltype(ignore)> v;     //2
v.push_back([&]() { return 100; });  //3
Run Code Online (Sandbox Code Playgroud)

直到第2行,它编译得很好.但第3行给出了编译错误:

错误:没有匹配函数来调用'std :: vector <main():: <lambda()>> :: push_back(main():: <lambda()>)'

我不想要一个函数指针向量或函数对象向量.但是,封装真实 lambda表达式的函数对象向量对我有用.这可能吗?

c++ lambda vector c++11

83
推荐指数
5
解决办法
3万
查看次数

C++ lambda,捕获为函数指针

我正在玩C++ lambdas以及它们对函数指针的隐式转换.我的开始示例是将它们用作ftw函数的回调.这按预期工作.

#include <ftw.h>
#include <iostream>

using namespace std;

int main()
{
    auto callback = [](const char *fpath, const struct stat *sb,
        int typeflag) -> int {
        cout << fpath << endl;
        return 0;
    };

    int ret = ftw("/etc", callback, 1);

    return ret;
}
Run Code Online (Sandbox Code Playgroud)

修改后使用捕获:

int main()
{

    vector<string> entries;

    auto callback = [&](const char *fpath, const struct stat *sb,
        int typeflag) -> int {
        entries.push_back(fpath);
        return 0;
    };

    int ret = ftw("/etc", callback, 1);

    for (auto entry : entries …
Run Code Online (Sandbox Code Playgroud)

c++ lambda function-pointers c++11

83
推荐指数
5
解决办法
5万
查看次数

如何在LINQ lambda中的多个表之间执行连接

我试图在LINQ中的多个表之间执行连接.我有以下课程:

Product {Id, ProdName, ProdQty}

Category {Id, CatName}

ProductCategory{ProdId, CatId} //association table
Run Code Online (Sandbox Code Playgroud)

我使用以下代码(其中product,category以及productcategory上述类的实例):

var query = product.Join(productcategory, p => p.Id, pc => pc.ProdID, (p, pc) => new {product = p, productcategory = pc})
                   .Join(category, ppc => ppc.productcategory.CatId, c => c.Id, (ppc, c) => new { productproductcategory = ppc, category = c});
Run Code Online (Sandbox Code Playgroud)

使用此代码,我从以下类中获取一个对象:

QueryClass { productproductcategory, category}
Run Code Online (Sandbox Code Playgroud)

producproductcategory的类型是:

ProductProductCategoryClass {product, productcategory}
Run Code Online (Sandbox Code Playgroud)

我不明白加入的"表"在哪里,我期待一个包含所涉及类的所有属性的单个类.

我的目标是使用查询产生的一些属性填充另一个对象:

CategorizedProducts catProducts = query.Select(m => new …
Run Code Online (Sandbox Code Playgroud)

c# linq lambda join multiple-tables

83
推荐指数
4
解决办法
19万
查看次数

_(下划线)是保留关键字

我刚刚s在下面的lambda表达式中替换为_:

s -> Integer.parseInt(s)
Run Code Online (Sandbox Code Playgroud)

Eclipse编译器说:

'_'不应该用作标识符,因为它是源级别1.8的保留关键字.

我没有在JLS§3.9词汇结构/关键词中找到任何解释.

java lambda java-8

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

为什么这个Java 8 lambda无法编译?

以下Java代码无法编译:

@FunctionalInterface
private interface BiConsumer<A, B> {
    void accept(A a, B b);
}

private static void takeBiConsumer(BiConsumer<String, String> bc) { }

public static void main(String[] args) {
    takeBiConsumer((String s1, String s2) -> new String("hi")); // OK
    takeBiConsumer((String s1, String s2) -> "hi"); // Error
}
Run Code Online (Sandbox Code Playgroud)

编译器报告:

Error:(31, 58) java: incompatible types: bad return type in lambda expression
    java.lang.String cannot be converted to void
Run Code Online (Sandbox Code Playgroud)

奇怪的是标记为"OK"的行编译得很好,但标记为"Error"的行失败了.他们看起来基本相同.

java lambda compiler-errors void java-8

83
推荐指数
4
解决办法
2万
查看次数

lambda函数可以递归吗?

可能重复:
c ++ 0x中的递归lambda函数

这是一个普通的旧递归函数:

int fak(int n)
{
    return (n <= 1) ? 1 : n * fak(n - 1);
}
Run Code Online (Sandbox Code Playgroud)

我如何编写像lambda函数这样的递归函数?

[](int n) { return (n <= 1) ? 1 : n * operator()(n - 1); }
// error: operator() not defined

[](int n) { return (n <= 1) ? 1 : n * (*this)(n - 1); }
// error: this wasn't captured for this lambda function
Run Code Online (Sandbox Code Playgroud)

是否有任何表达当前lambda的表达式,因此它可以递归调用自身?

c++ recursion lambda c++11

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

Java 8 Lambda表达式 - 嵌套类中的多个方法怎么样

我正在阅读以下新功能:http://www.javaworld.com/article/2078836/java-se/love-and-hate-for-java-8.html

我看到了下面的例子:

使用匿名类:

button.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent ae) {
        System.out.println("Action Detected");
    }
});
Run Code Online (Sandbox Code Playgroud)

使用Lambda:

button.addActionListener(e -> {
    System.out.println("Action Detected");
});
Run Code Online (Sandbox Code Playgroud)

MouseListener如果他们想在匿名类中实现多个方法,有人会做什么,例如:

public void mousePressed(MouseEvent e) {
    saySomething("Mouse pressed; # of clicks: "
               + e.getClickCount(), e);
}

public void mouseReleased(MouseEvent e) {
    saySomething("Mouse released; # of clicks: "
               + e.getClickCount(), e);
}
Run Code Online (Sandbox Code Playgroud)

... 等等?

java lambda anonymous-class java-8

79
推荐指数
3
解决办法
5万
查看次数