今天我了解到 rust 不支持 fn 参数的协变,只有它的返回类型是协变的。(参见 Rust 文档)
为什么我在 Rust 中了解到这个事实?因为我试图实现一个非常简单的游戏,我将逻辑、事件处理和绘图分离为三个不同的函数,但所有函数都在相同的玩家向量上运行。
如果这是不可能的,与 C# 版本相比,Rust 中的等效项是什么?
在 C# 中,这是非常简单的Fiddle 您可以定义一个类 X 必须实现的接口 Y,并定义一个相应的委托,该委托需要该接口 Y 的 IEnumerable 作为参数。现在您可以在需要的不同方法之间共享 X 的列表只有一个接口Y。
using System;
using System.Collections.Generic;
public interface Actionable{
void Do();
}
public interface Drawable{
void Draw();
}
public class Player: Drawable, Actionable{
public void Do(){
Console.WriteLine("Action");
}
public void Draw(){
Console.WriteLine("Draw");
}
}
public class Program
{
public delegate void DrawHandler(IEnumerable<Drawable> obj);
public delegate void LogicHandler(IEnumerable<Actionable> obj);
public static void gameloop(DrawHandler …Run Code Online (Sandbox Code Playgroud) 正如您可以在标题中看到的那样,它是一个相当简单的主题.但是在实现可能的不同方法来获得N个数的二次和时,我遇到了一些非常奇怪的事情.
我实现了三个不同的版本:
所有三个函数都返回了与给定输入相同的结果.现在的大问题是.第三个功能怎么可能正常工作?该代码如下所示:
void quadratGauss(int n){
printf("+quadratGauss: \n");
int result = ((n*(n+1))*(2*n+1))/2;
printf("Result: %d\n----------------\n",result);
}
void quadratIterativClassic(int n){
int result;
printf("+quadratIterativClassic: \n");
for(int i;i<=n;i++)
result += i * i;
printf("Result: %d\n----------------\n",result);
}
void quadratIterativeBitOperation(int n){
int result;
printf("+quadratIterativeBitOperation: \n");
for(int i;i<=n;i++)
result += i^2;
printf("Result: %d\n----------------\n",result);
}
Run Code Online (Sandbox Code Playgroud)
如您所见,我使用XOR运算符.我原本想使用移位运算符"<<"但我也尝试过其他人.当我尝试XOR运算符时,令人惊叹的是:结果仍然与之前相同,与其他两个函数相同.我认为这是不可能的,因为XOR不是电源操作的操作符,因为C不包含这样的操作符但是我最终得到了正确的结果.
我用不同数量的不同"尺寸"测试了这些功能.每个功能的结果都没有什么奇怪的.
我不知道为什么.但必须有一个解释,不是吗?如果你有一个,我会很感激写下一个可能的原因,为什么你可以用XOR运算符来实现它.
这里整个主文件:
#include <stdlib.h>
#include <stdio.h>
#include <iostream>
#define N 5000
void sumGauss(int n)
{
printf("+sumGauss: \n");
int result = (n*(n+1)/2);
printf("Result: %d\n----------------\n",result); …Run Code Online (Sandbox Code Playgroud) 我现在有一些奇怪的事情发生了.我正在尝试使用VC++编译器编写模板类.
在我的课堂上,为了清晰起见,我得到了一些typedef.我头文件之外的实际实现
template<typename T,
typename = typename std::enable_if<std::is_arithmetic<T>::value,T>::type>
class Integer
{
public:
typedef T value_type;
typedef Integer < value_type > Self;
typedef Self& SelfReference;
typedef Self* SelfRawPointer;
...
public:
SelfReference operator =(const SelfReference);
Run Code Online (Sandbox Code Playgroud)
*.tcc - 文件:
...
template<typename T> Integer<T>::SelfReference Integer<T>::operator =(const
Integer<T>::SelfReference rhs)
{
return this->assign(rhs);
};
...
Run Code Online (Sandbox Code Playgroud)
使用gcc过去我没有任何问题这样做,但现在在Windows上,编译器抱怨'SelfReference':C2061:语法错误:标识符'SelfReference'
我不知道出了什么问题,因为过去使用的gcc ...我错过了什么吗?如果我将函数内联编写,则不会出现此问题.我现在只是好奇为什么在Windows上我遇到了这样的问题!