小编Nyc*_*cto的帖子

Scala:Case类unapply vs手动实现和类型擦除

我试图了解Scala对Case Classes的作用,使它们对类型擦除警告有所不同.

假设我们有以下简单的类结构.它基本上是Either:

abstract class BlackOrWhite[A, B]

case class Black[A,B]( val left: A ) extends BlackOrWhite[A,B]

case class White[A,B]( val right: B ) extends BlackOrWhite[A,B]
Run Code Online (Sandbox Code Playgroud)

而你正试图像这样使用它:

object Main extends App {

    def echo[A,B] ( input: BlackOrWhite[A,B] ) = input match {
        case Black(left) => println( "Black: " + left )
        case White(right) => println( "White: " + right )
    }

    echo( Black[String, Int]( "String!" ) )
    echo( White[String, Int]( 1234 ) )
}
Run Code Online (Sandbox Code Playgroud)

一切都编译和运行没有任何问题.但是,当我unapply自己尝试实现该方法时,编译器会发出警告.我使用了以下类结构与Main上面相同的类: …

scala pattern-matching type-erasure case-class unapply

19
推荐指数
2
解决办法
7319
查看次数

使用C++进行PHP扩展

我最近开始考虑编写PHP扩展,并阅读了本文,其中介绍了使用C++构建扩展的起点.当我开始定制时,我遇到了一些试图将一些功能拆分成单独文件的故障.一切都编译和链接没有问题,但当我尝试实际使用扩展时发生错误.确切的信息是:

$ php -dextension=test.so -r "var_dump( new Test );"
php: symbol lookup error: /etc/php/ext/test.so: undefined symbol: _ZN9ContainerI4TestEC1EP17_zend_class_entry
Run Code Online (Sandbox Code Playgroud)

我在两台计算机上试过这个并且都遇到了同样的问题.我知道它找不到Container构造函数的实际实现,但我不知道如何让它在正确的位置查找.

在发布这里之前,我已经尝试尽可能多地减少了绒毛,但是在php界面代码中还有很多瑕疵.代码如下:

config.m4中:

PHP_ARG_ENABLE(test,
    [Whether to enable the "test" extension],
    [  --enable-test      Enable "test" extension support])

if test $PHP_TEST != "no"; then
    PHP_REQUIRE_CXX()
    PHP_SUBST(TEST_SHARED_LIBADD)
    PHP_ADD_LIBRARY(stdc++, 1, TEST_SHARED_LIBADD)
    PHP_NEW_EXTENSION(test, interface.cpp internals.cpp, $ext_shared)
fi
Run Code Online (Sandbox Code Playgroud)

interface.h:

#ifndef INTERFACE_H_
   #define INTERFACE_H_
   #define PHP_TEST_EXTNAME  "test"
   #define PHP_TEST_EXTVER   "0.1"
   #ifdef HAVE_CONFIG_H
      #include "config.h"
   #endif
#endif
Run Code Online (Sandbox Code Playgroud)

interface.cpp:

#include "interface.h"
#include "internals.h"
#include "php.h"

class Test {}; 

extern zend_module_entry …
Run Code Online (Sandbox Code Playgroud)

php c++ php-extension

5
推荐指数
1
解决办法
2352
查看次数

Scala:扩展地图并定义+

我正在尝试编写一个小的包装类,以使Gson库更加友好.不幸的是,当我试图按照我想要的方式进行此操作时,我遇到了编译错误.

这是我到目前为止的代码:

package com.test

import com.google.gson.{JsonObject, JsonElement}
import scala.collection.Iterator
import scala.collection.immutable.Map

case class GsonMap ( private val inner: JsonObject = new JsonObject )
    extends Map[String, JsonElement] {

    /** {@inheritDoc} */
    override def iterator: Iterator[(String, JsonElement)]
        = new Iterator[(String, JsonElement)] {
            private val entries = inner.entrySet.iterator
            override def hasNext: Boolean = entries.hasNext
            override def next: (String, JsonElement) = {
                val elem = entries.next
                ( elem.getKey, elem.getValue )
            }
        }

    /**
     * Returns a clone of the inner JsonObject
     */ …
Run Code Online (Sandbox Code Playgroud)

generics scala map

0
推荐指数
1
解决办法
1366
查看次数