假设我们有一个类似于内存的类Image,有可链接的方法,比如Resize()和ConvertTo().
如果这个类是不可变的,那么当我开始做类似的事情时,它会不会占用大量的内存i.Resize(500, 800).Rotate(90).ConvertTo(Gif),相比之下,一个可变的自我修改?如何用函数式语言处理这种情况?
什么区别List.empty,List()和new List()?我什么时候应该使用哪个?
我有一个带有Multiindex的数据框,并希望修改Multiindex的一个特定级别.例如,第一级可能是字符串,我可能想要从该索引级别删除空格:
df.index.levels[1] = [x.replace(' ', '') for x in df.index.levels[1]]
Run Code Online (Sandbox Code Playgroud)
但是,上面的代码会导致错误:
TypeError: 'FrozenList' does not support mutable operations.
Run Code Online (Sandbox Code Playgroud)
我知道我可以reset_index并修改列然后重新创建Multiindex,但我想知道是否有更优雅的方法来直接修改Multiindex的某个特定级别.
是否可以创建一个具有对合作伙伴对象的不可变引用的类,或者它是否必须是var我在创建后分配的类?
例如
class PairedObject (p: PairedObject, id: String) {
val partner: PairedObject = p // but I need ref to this object to create p!
}
Run Code Online (Sandbox Code Playgroud)
或类似地,我如何实例化以下对?
class Chicken (e: Egg) {
val offspring = e
}
class Egg (c: Chicken) {
val mother = c
}
Run Code Online (Sandbox Code Playgroud) 我正在做一些javascript编码,我想知道长度方法是"预先计算",还是由JS引擎记住.
所以,问题是:
如果我经常检查数组长度,并假设我没有更改它(通过闭包使其不可变),我应该预先计算长度方法并将其存储在某个变量中吗?
谢谢!
我正在利用Scala在业余时间学习函数式编程,我有一个闲置的新手问题.
在做像Haar小波变换这样的事情时,我可以看到具有不可变对象的优雅 - 即当数据本身由对象表示时不会改变.
但我看到一个博客,其中有人以小游戏为例证明了不变性.如果一个生物对象收到了伤害,它没有改变它的状态 - 它返回了一个新的生物对象,其中包含新的生命值和一个新的"aggro to X"标志.但是,如果我们设计像MMORPG这样的东西,魔兽世界说.战场上的一百名玩家......可能有成千上万的攻击和缓冲/减益效果以不同的方式影响他们.是否仍然可以使用完全不可变的对象来设计系统?对我来说,似乎每个'滴答'会有一大群新的实例.为了获得当前有效的对象实例,所有客户端都会不断地经历某种中心"游戏世界"对象,或者?
函数式编程是否适用于此,或者这是"最佳工作的最佳工具,可能在这里不可变"的情况?
我很好奇StringBuilder类是如何在内部实现的,因此我决定查看Mono的源代码并将其与Reflector的反汇编代码进行比较.从本质上讲,Microsoft的实现用于char[]在内部存储字符串表示,以及一些不安全的方法来操作它.这很简单,没有提出任何问题.但当我发现Mono在StringBuilder中使用一个字符串时,我很困惑:
private int _length;
private string _str;
Run Code Online (Sandbox Code Playgroud)
第一个想法是:"多么无谓的StringBuilder".但后来我发现可以使用指针改变字符串:
public StringBuilder Append (string value)
{
// ...
String.CharCopy (_str, _length, value, 0, value.Length);
}
internal static unsafe void CharCopy (char *dest, char *src, int count)
{
// ...
((short*)dest) [0] = ((short*)src) [0]; dest++; src++;
}
Run Code Online (Sandbox Code Playgroud)
我曾经在C/C++中编程一点,所以我不能说这段代码让我很困惑,但我认为字符串是完全不可变的(即绝对没有办法改变它).所以实际的问题是:
我发现以下问题是Java"pass-by-reference"还是"pass-by-value"?.
我几乎阅读了所有内容,但是如果我想要这个foo(-)方法,我还不知道该怎么做才能改变我String的价值?(也许或不参考,对我来说无关紧要).
void foo(String errorText){
errorText="bla bla";
}
int main(){
String error="initial";
foo(error);
System.out.println(error);
}
Run Code Online (Sandbox Code Playgroud)
我想bla bla在控制台上看到.可能吗?
我最近了解了EnumMap在Java中的优点,并希望将现有的替换ImmutableMap<OccupancyType, BigDecimal>为EnumMap.但是,我也喜欢ImmutableMap提供的不可变属性.
我有以下代码:
extern crate rand;
use rand::{thread_rng, Rng};
fn main() {
let mut vec: Vec<u32> = (0..10).collect();
let mut slice: &[u32] = vec.as_mut_slice();
thread_rng().shuffle(slice);
}
Run Code Online (Sandbox Code Playgroud)
并得到以下错误:
error[E0308]: mismatched types
--> src/main.rs:9:26
|
9 | thread_rng().shuffle(slice);
| ^^^^^ types differ in mutability
|
= note: expected type `&mut [_]`
found type `&[u32]`
Run Code Online (Sandbox Code Playgroud)
我想我明白向量和切片的内容是不可变的,这会导致错误,但我不确定.
签名as_mut_slice是pub fn as_mut_slice<'a>(&'a mut self) -> &'a mut [T],所以切片应该是可变的,但它不知何故.
我知道必须有一个简单的解决办法,但我尽我所能,无法让它发挥作用.
immutability ×10
java ×2
scala ×2
.net ×1
arrays ×1
c# ×1
collections ×1
enum-map ×1
guava ×1
iterator ×1
javascript ×1
list ×1
memory ×1
multi-index ×1
mutability ×1
object ×1
pandas ×1
parameters ×1
pointers ×1
python ×1
rust ×1
string ×1