首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么或如何是向量2/向量3-结构不可变?

为什么或如何是向量2/向量3-结构不可变?
EN

Stack Overflow用户
提问于 2021-03-26 15:12:12
回答 3查看 671关注 0票数 1

对于网格系统(2D-数组),我正在创建一个Index2-struct。这与Vector2非常相似。

遇到了一些我读到的关于结构的问题。遇到了变幻莫测和不可改变的主题。

长话短说,易变的结构是不好的。因此,我想知道,我如何使我的结构不变?这让我找到了this post

如果正确理解,要使结构不可变,您必须确保一旦创建了实例,就不能修改实例的成员。

但是,当我以统一的方式看Vector2-struct时。一旦创建了一个new Vector2(0f, 0f),就可以修改它的值:

代码语言:javascript
复制
Vector2 myVector = new Vector2(1f, 1f);
myVector.x = 2f;

这个很好用。

.Set-method也是如此:

代码语言:javascript
复制
Vector2 myVector = new Vector2(1f, 1f);
myVector.Set(2f, 2f);

此外,在Vector的定义,我没有看到任何解决方案建议在上述链接的帖子。

这让我想知道几件事?

  1. 是一个Vector2 --一个不可变的结构?如果是的话,它的结构是如何在能够修改成员的同时仍然是不可变的?如果不是,为什么仍然是一个安全的结构?

EN

回答 3

Stack Overflow用户

发布于 2021-03-26 15:29:20

答1:不,这不是一成不变的,我想你证明了自己

回答2:很确定你的问题是矛盾的,你不能修改一个不变的对象。

回答3:不可变的对象是伟大的,如果你有你想要创建的东西,一次又一次地使用而不改变,然后你就完成了。如果您想要创建、使用、更改、再次使用、再次更改等等,它们是不合适的。如果你有这样一个场景,那就是创建/使用-但是没有改变/完成,那么使它不可变是一件好事,因为你知道它没有被编辑-在你的背后.可以像代码中的石头一样依赖它。这不适合你想要改变的东西(例如滚球的位置)。因此,对于最后一种情况,Vector2是理想的。它并不是真正的安全和不安全,而是恰当和不恰当的

票数 1
EN

Stack Overflow用户

发布于 2021-03-26 16:01:55

不是一成不变的。大多数人由于无法修改Vector3的各个组件而有问题,他们做的事情如下

代码语言:javascript
复制
transform.position.x=value;

这是行不通的,但不是因为永恒不变的原因。这是行不通的,因为transform.position实际上不是一个字段,它是一个属性(getter setter对)。在Unity3D公开的几乎任何内容中,都是setter/getter,因此它的定义不是

公共Vector3立场;

但是,由于三个独立的元素、一个后备字段和一个方法的parir运行来检索或设置值,所以(我将我的属性pos称为不与实际转换相混淆的位置- wchich是比较复杂的)。

代码语言:javascript
复制
private Vector3 _pos;
public Vector3 pos { get { return _pos;} set  { _pos=value;}}

这就是诀窍。属性本质上只是C#中的语法糖,因此在幕后编译如下

代码语言:javascript
复制
private Vector3 _pos;
public Vector3 GetPos () 
   { return _pos; } 
public void SetPos(Vector3 value) 
   {  _pos=value;}}

现在,如果你仔细看一下这样的语句

代码语言:javascript
复制
  transform.position.x+=1;  // won't work

它们没有意义,因为你真正的意思是:

代码语言:javascript
复制
Vector3 temp = transform.GetPos();
temp.x+=1; // Vectors3 mutate all right
transform.SetPos(temp);

因为.position是一个属性,并且有一个后备方法,所以在修改和发送一个新的结构之前,它必须执行并返回一个完整的结构。如果位置是一个字段,这将是很好的,但转换将无法知道它已经改变并应用您的变化(如果您设置全局位置,它确实需要做大量的数学操作)

票数 1
EN

Stack Overflow用户

发布于 2021-03-26 15:28:35

  1. 不,它是可变的
  2. ,它不是
  3. ,它不是;所有可变结构可能引起问题的方法都很适用;所以:小心
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66819583

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档