小编Rob*_*Jr.的帖子

Scala 如何在特征中定义一个方法以通用地返回子类

给定一个非常简化的模型,说明我要实现的内容:

sealed trait Data
case class CustomerData(values: List[String])
case class EmployeeData(values: List[String])
Run Code Online (Sandbox Code Playgroud)

我想在 trait 上定义一个方法,该方法要求每个 case 类定义一个方法,该方法返回一个带有附加字符串的新实例。以下似乎不起作用,它让我感到困惑,但我希望 T 不仅仅是我任何类型的数据,而是子类的实际类型:

sealed trait Data {
  def withNewValue[T <: Data](v : String) : T
}
Run Code Online (Sandbox Code Playgroud)

子类应该如下所示:

case class CustomerData(values: List[String]) {
  override def withNewValue[CustomerData](v : String) : CustomerData = CustomerData(v :: values)
}
Run Code Online (Sandbox Code Playgroud)

但这不会编译也不会限制覆盖要求类型是 CustomerData 而不是 EmployeeData 允许某人做一些愚蠢的事情,例如:

case class CustomerData(values: List[String]) {
  override def withNew[EmployeeData](v : String) : EmployeeData = EmployeeData(v :: values)
}
Run Code Online (Sandbox Code Playgroud)

我有什么想法可以实现我的目标吗?

scala

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

在Scala for Expresisons中,Yield语法明显不一致?

我正在尝试学习scala,我正在努力理解为什么以下是合法的:

for (idx <- 1 to 10) yield idx
Run Code Online (Sandbox Code Playgroud)

但以下是不合法的.

for (idx <- 1 to 10) { yield idx }
Run Code Online (Sandbox Code Playgroud)

它们在语法上看起来是一样的.我错过了什么?

提前致谢.

scala

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

对在C中更新结构成员感到困惑

自从我做了C以来已经很长时间了(25年)所以我忘记了一些事情所以请原谅这个问题.

鉴于我有以下声明:

typedef struct item {
  int field;
} Item;
typedef struct data {
  Item b;
} Data;
Run Code Online (Sandbox Code Playgroud)

当它传递给函数时,我一直在尝试更新结构,这根本不起作用.

static void foo(Data *data) {
  data->b.field = 3; // doesn't work, the struct remains unchanged.
}
static void test() {
  Data v = {.b = {.field = 2}};
  foo(&v);
}
Run Code Online (Sandbox Code Playgroud)

但是,如果我稍微改变声明,使用malloc来分配它是有效的.

typedef struct data {
  Item *b;
};
static void foo(struct data *data) {
  data->b->field = 3; // works.
}
static void test() {
  Data v = (struct data*) malloc(sizeof(Data));
  Item …
Run Code Online (Sandbox Code Playgroud)

c struct

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

你怎么能在Scala中用访问者语义编写一个强大的Enum?

我经常使用一种模式来使代码更简单,我喜欢称之为Power Enum,它是一个利用访问者模式以及携带自定义数据的枚举.这是Java中的一个例子:

import java.security.SecureRandom;
import java.util.UUID;
import java.util.stream.IntStream;

public class PowerEnumDemo {
    private static final SecureRandom random = new SecureRandom();

    public static void main(String[] args) {
        for (int i = 0; i < 3 ; i++) {
            final Color selected = Color.values()[random.nextInt(3)];
            System.out.println("Selected: " + selected);
            System.out.println("rgb: " + selected.rgb);
            selected.visit();
        }
    }

    public enum Color {
        RED("0000ff") {
            @Override
            public void visit() {
                IntStream.range(1, 10).forEach(System.out::println);
            }
        },
        GREEN("00ff00") {
            @Override
            public void visit() {
                System.out.println(UUID.randomUUID().toString().chars().filter(c -> c == 'a').count()); …
Run Code Online (Sandbox Code Playgroud)

enumeration scala visitor-pattern

-1
推荐指数
1
解决办法
271
查看次数

标签 统计

scala ×3

c ×1

enumeration ×1

struct ×1

visitor-pattern ×1