(我用Kotlin 1.1.2-2)
例如,我如何知道推断的表达式if (boolean_value) 1 else 2.0?kotlinc-jvm没有显示类型.javaClass也没有帮助,因为它显示计算值的类型而不是表达式.
>>> (if (true) 1 else 2.0).javaClass.name
java.lang.Integer
>>> (if (false) 1 else 2.0).javaClass.name
java.lang.Double
>>> val v: Double = if (false) 1 else 2.0
error: the integer literal does not conform to the expected type Double
val v: Double = if (false) 1 else 2.0
^
Run Code Online (Sandbox Code Playgroud) 我的目标是打印具有特征对象成员的结构的内容,但我找不到如何告诉 Rust 编译器该成员还实现了其他特征,例如Displayor Debug。
例如,在下面的程序中,我想打印 的结构S2(并S1进行比较),但我陷入了 的实现中fmt。
trait Tr {}
impl Tr for usize {}
impl Tr for String {}
#[derive(Debug)]
struct S1<A: Tr + std::fmt::Debug> {
member: Box<A>,
}
struct S2 {
member: Box<Tr>,
}
impl std::fmt::Debug for S2 {
fn fmt(&self, fmt: &mut std::fmt::Formatter<'_>) -> Result<(), std::fmt::Error> {
// ??
Ok(())
}
}
fn main() {
let s1 = S1 {
member: Box::new(String::from("abc")),
};
println!("{:?}", s1);
let s2 = …Run Code Online (Sandbox Code Playgroud) (我使用kotlin 1.1.2-2)
我发现有两种方法可以定义可变但不能通过分配的属性=。
var与私人二传手val具有私有变量支持属性我还发现他们有不同的行为。
当T声明时out,具有私有 setter 的var类型T不能被定义,而val具有支持属性的类型是合法的。
open class A<out T>(v: T) {
// error because T occurs in invariant position
var prop1: T = v
private set
private var _prop: T = v
val prop2: T get() = _prop
}
Run Code Online (Sandbox Code Playgroud)
为什么prop1位置不变而prop2不是不变?差异从何而来?
我用kotlin 1.1.2-2
我想plus100(Int):Int从方法调用顶级函数Mul2.plus100(Int):Int.我尝试在下面的代码中执行此操作,但实际上Mul2.plus100本身也被调用.
class Mul2 {
fun plus100(v: Int): Int = plus100(2 * v)
}
fun plus100(v: Int): Int = v + 100
fun main(args: Array<String>) {
val v = Mul2()
println(v.plus100(10)) // expected: "120", actual: StackOverflowError
}
Run Code Online (Sandbox Code Playgroud)
反正有访问plus100从Mul2.plus100?
(我使用OCaml版本4.02.3)
我定义了一个类型 self
# type self = Self of self;;
type self = Self of self
Run Code Online (Sandbox Code Playgroud)
及其实例 s
# let rec s = Self s;;
val s : self = Self <cycle>
Run Code Online (Sandbox Code Playgroud)
由于OCaml是一种严格的语言,我希望定义s会陷入无限递归。但是口译员说s确实有价值Self <cycle>。
我还将一个功能应用于s。
# let f (s: self) = 1;;
val f : self -> int = <fun>
# f s;;
- : int = 1
Run Code Online (Sandbox Code Playgroud)
似乎s未在函数应用程序之前进行评估(例如使用非严格语言)。
OCaml如何处理像循环数据s?Self <cycle>是正常形式吗?