我想弄清楚,但我有点陷入困境.
类型和堆相关的方式很简单,如果有点奇怪.(为什么不给VkMemoryHeap
一个VkMemoryType
会员?)
我想我明白了所有的VkMemoryPropertyFlags
意思,它们看起来相当简单.
但是VkMemoryHeap.flags
会员呢?它显然只有一个非零有效值,VkMemoryHeapFlagBits.VK_MEMORY_HEAP_DEVICE_LOCAL_BIT
虽然它本身不会太奇怪,但也有一个VkMemoryPropertyFlagBits.VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT
可能出现在堆的内存类型上.
VkMemoryHeap.flags
会员意味着什么以及它与VkMemoryType.flags
会员有什么关系?
我有一个终生的结构:
struct HasLifetime<'a>( /* ... */ );
Run Code Online (Sandbox Code Playgroud)
有一个 trait 的实现Foo
:
impl<'a, 'b: 'a> Foo for &'a mut HasLifetime<'b> { }
Run Code Online (Sandbox Code Playgroud)
我想实现以下功能:
fn bar_to_foo<'a, 'b: 'a>(bar: &'a mut Lifetime<'b>) -> impl Foo {
bar
}
Run Code Online (Sandbox Code Playgroud)
这不会编译,因为返回impl
的仅对'a
. 但是,指定impl Foo + 'a
导致:
struct HasLifetime<'a>( /* ... */ );
Run Code Online (Sandbox Code Playgroud)
带有装箱 trait 对象的看似等效的函数编译:
fn bar_to_foo<'a, 'b: 'a>(bar: &'a mut Lifetime<'b>) -> Box<Foo + 'a> {
Box::new(bar)
}
Run Code Online (Sandbox Code Playgroud)
我如何定义bar_to_foo
与impl Trait
?
编辑1:我知道有一些替代品,如伸缩式,这是一个纯粹的教育问题.
我知道这是真的,但为什么一定是这样呢?看起来像是这样的:
public class Foo{
private int bar;
public void SetBar(int baz = ThatOtherClass.GetBaz(3)){
this.bar = baz;
}
}
Run Code Online (Sandbox Code Playgroud)
编译器可以将方法更改为:
public void SetBar(int baz){
//if baz wasn't passed:
baz = ThatOtherClass.GetBaz(3);
this.bar = baz;
}
Run Code Online (Sandbox Code Playgroud)
为什么那不起作用,或者不行,这只是一个设计决定?
我需要一个像AvalonDock这样的对接系统用于一个项目,但它似乎最后一次更新于2013年6月.是否有更多...积极开发我可以使用它?
我正在尝试编写一个宏,From
通过将类型包装在某个变体中来为枚举生成一个impl。
我想出了这个:
macro_rules! variant_derive_from {
($enum:ty:$variant:ident($from:ty)) => {
impl From<$from> for $enum {
fn from(thing: $from) -> $enum { return $enum::$variant(thing) }
}
};
}
Run Code Online (Sandbox Code Playgroud)
但是,每当我尝试实际使用此宏时,都会出现以下错误:
error: expected expression, found `B`
| fn from(thing: $from) -> $enum { $enum::$variant(thing) }
| ^^^^
Run Code Online (Sandbox Code Playgroud)
我无法弄清楚为什么会发生这种情况,所以我运行了一个带有宏跟踪的构建,并且宏显然扩展到以下内容(当然是虚拟类型):
impl From < A > for B { fn from ( thing : A ) -> B { B :: AVariant ( thing ) } }
Run Code Online (Sandbox Code Playgroud)
将其直接粘贴到代码中时,它编译成功。是什么赋予了??
从本质上讲,Foo实例在获取其值时会使用更多内存,如下所示:
public class Foo
{
internal double bar;
double GetBar(){ return bar; }
}
Run Code Online (Sandbox Code Playgroud)
或者像这样?
public class Foo
{
internal double bar;
}
public static class FooManager
{
public static double GetBar(Foo foo) { return foo.bar; }
}
Run Code Online (Sandbox Code Playgroud)
也就是说,每个方法每个对象或每个类型使用的内存是多少?
在 .NET 中,如果有一个具有方法Foo<T>(T t)
(无约束)和方法 Foo(string s) 的类,则调用会Foo("test")
调用Foo
接受string
. 这一切都很好,除非string
重载是一个扩展方法,在这种情况下总是调用泛型版本。是否有解决此问题的方法,还是我不走运?
我正在采用某种类型的迭代器,该迭代器必须实现 Trait A
,并尝试将其转换为该 Trait 的 a Vec
of Box
es :
trait A {}
fn test2<'a, I>(iterator: I) -> Vec<Box<A + 'a>>
where
I: IntoIterator,
I::Item: A + 'a,
{
iterator
.into_iter()
.map(|a| Box::new(a))
.collect::<Vec<Box<A + 'a>>>()
}
Run Code Online (Sandbox Code Playgroud)
然而,这无法编译,并说:
trait A {}
fn test2<'a, I>(iterator: I) -> Vec<Box<A + 'a>>
where
I: IntoIterator,
I::Item: A + 'a,
{
iterator
.into_iter()
.map(|a| Box::new(a))
.collect::<Vec<Box<A + 'a>>>()
}
Run Code Online (Sandbox Code Playgroud)
这个错误有点道理,但我不明白为什么以下内容没有问题:
fn test<'a, T: A + 'a>(t: T) -> Box<A + 'a> { …
Run Code Online (Sandbox Code Playgroud) 最近想写一段类似下面的代码:
pub struct Foo<'a, F> /* where F: Fn(&u32) -> bool */ {
u: &'a u32,
f: F
}
impl<'a, F> Foo<'a, F>
where F: Fn(&u32) -> bool
{
pub fn new_foo<G: 'static>(&self, g: G) -> Foo<impl Fn(&u32) -> bool + '_>
where G: Fn(&u32) -> bool
{
Foo { u: self.u, f: move |x| (self.f)(x) && g(x) }
}
}
Run Code Online (Sandbox Code Playgroud)
在这里, 的实例Foo
表示一段数据 (the u32
) 的条件,其中Foo
可以通过 由限制较少的数据构建限制性更强的数据new_foo
,而不会消耗旧数据。然而,上面的代码并没有像编写的那样编译,而是给出了相当神秘的错误消息:
error[E0308]: mismatched types
--> src/lib.rs:9:52
| …
Run Code Online (Sandbox Code Playgroud) 比方说,如果我出于某种原因在float类型周围创建一个薄包装器,如下所示:
public class WrappedFloat
{
private float value;
public WrappedFloat(float value)
{
this.value = value;
}
public static implicit operator float(WrappedFloat wrapped)
{
return wrapped.value;
}
public static implicit operator WrappedFloat(float value)
{
return new WrappedFloat(value);
}
}
Run Code Online (Sandbox Code Playgroud)
这段代码显然是完全有效的:
new WrappedFloat(4.0F) + new WrappedFloat(3.0F)
Run Code Online (Sandbox Code Playgroud)
由于WrappedFloat
没有定义任何算术运算符,因此必须有一些关于它的隐式转换以float
允许它.但是运算符重载只是方法的语法糖,对吧?这不像我可以调用方法(即CompareTo
)WrappedFloat
因为float
有它们.那么这里的运营商有什么特别之处呢?允许这样做的规则是什么?