给定一个非常简化的模型,说明我要实现的内容:
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,我正在努力理解为什么以下是合法的:
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)
它们在语法上看起来是一样的.我错过了什么?
提前致谢.
自从我做了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) 我经常使用一种模式来使代码更简单,我喜欢称之为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)