在Ruby中,有些方法有一个问号(?
),它会询问一个问题include?
,询问是否包含有问题的对象,然后返回true/false.
但为什么有些方法会有感叹号(!
)而其他方法却没有?
这是什么意思?
我正在尝试使用Python从字符串中删除特定字符.这是我现在正在使用的代码.不幸的是它似乎对字符串没有任何作用.
for char in line:
if char in " ?.!/;:":
line.replace(char,'')
Run Code Online (Sandbox Code Playgroud)
我该怎么做呢?
在这里讨论了SO之后,我已经多次读过可变结构是"邪恶"的评论(就像这个问题的答案一样).
C#中可变性和结构的实际问题是什么?
我们都知道String
Java 中是不可变的,但请检查以下代码:
String s1 = "Hello World";
String s2 = "Hello World";
String s3 = s1.substring(6);
System.out.println(s1); // Hello World
System.out.println(s2); // Hello World
System.out.println(s3); // World
Field field = String.class.getDeclaredField("value");
field.setAccessible(true);
char[] value = (char[])field.get(s1);
value[6] = 'J';
value[7] = 'a';
value[8] = 'v';
value[9] = 'a';
value[10] = '!';
System.out.println(s1); // Hello Java!
System.out.println(s2); // Hello Java!
System.out.println(s3); // World
Run Code Online (Sandbox Code Playgroud)
为什么这个程序运行这样?为什么价值s1
和s2
变化,但不是s3
?
这可能是有史以来最愚蠢的问题,但我认为这对新手来说完全是一个混乱.
String
不可改变的?StringBuilder
比首字母和副词更受欢迎?一个很好的例子(在Java中)将非常感激.
我最近在javascript中遇到了const关键字.据我所知,它用于创建不可变变量,我已经测试过以确保它不能重新定义(在node.js中):
const x = 'const';
const x = 'not-const';
// Will give an error: 'constant 'x' has already been defined'
Run Code Online (Sandbox Code Playgroud)
我意识到它还没有在所有浏览器中标准化 - 但我只对node.js/v8的上下文感兴趣,并且我注意到当使用var关键字时,某些开发人员/项目似乎非常喜欢它达到同样的效果.
问题?
何时使用const代替var?
是否应该在每次声明不会重新分配的变量时使用它?
如果使用var代替const,反之亦然,它实际上是否有任何区别?
对于华丽的标题感到抱歉 - 如果我能想出一个简洁的标题,我就不用问这个问题了.
假设我有一个不可变的列表类型.它有一个操作Foo(x)
,它返回一个带有指定参数的新的不可变列表作为最后的额外元素.因此,要建立一个值为"Hello","immutable","world"的字符串列表,您可以编写:
var empty = new ImmutableList<string>();
var list1 = empty.Foo("Hello");
var list2 = list1.Foo("immutable");
var list3 = list2.Foo("word");
Run Code Online (Sandbox Code Playgroud)
(这是C#代码,如果您觉得语言很重要,我最感兴趣的是C#建议.这不是一个基本的语言问题,但语言的习语可能很重要.)
重要的是现有的列表不会被改变Foo
- 所以empty.Count
仍然会返回0.
获得最终结果的另一种(更惯用的)方式是:
var list = new ImmutableList<string>().Foo("Hello")
.Foo("immutable")
.Foo("word");
Run Code Online (Sandbox Code Playgroud)
我的问题是:Foo最好的名字是什么?
编辑3:正如我稍后透露的那样,该类型的名称可能实际上并不存在ImmutableList<T>
,这使得该位置清晰.想象一下,它是TestSuite
并且它是不可变的,因为它所属的整个框架是不可变的......
(编辑完3)
到目前为止我提出的选项:
Add
:常见于.NET,但意味着原始列表的变异Cons
:我相信这是函数式语言中的正常名称,但对于没有这些语言经验的人来说毫无意义Plus
:我最喜欢的,它并不意味着我的变异.显然,这也用在Haskell中,但期望略有不同(Haskell程序员可能希望它将两个列表一起添加而不是将一个值添加到另一个列表中).With
:与其他一些不可变的约定一致,但它与IMO没有完全相同的"附加性".And
:不是很具描述性.我用来选择的标准是:
如果我不够清楚,请询问更多细节......
编辑1:这里是我的喜欢推理Plus
来Add
.考虑以下两行代码:
list.Add(foo); …
Run Code Online (Sandbox Code Playgroud) 请考虑以下示例.
String str = new String();
str = "Hello";
System.out.println(str); //Prints Hello
str = "Help!";
System.out.println(str); //Prints Help!
Run Code Online (Sandbox Code Playgroud)
现在,在Java中,String对象是不可变的.那么为什么对象str
可以赋值"帮助!".这与Java中字符串的不变性相矛盾吗?任何人都可以向我解释一下不变性的确切概念吗?
编辑:
好.我现在得到它,但只是一个后续问题.以下代码如何:
String str = "Mississippi";
System.out.println(str); // prints Mississippi
str = str.replace("i", "!");
System.out.println(str); // prints M!ss!ss!pp!
Run Code Online (Sandbox Code Playgroud)
这是否意味着再次创建了两个对象("Mississippi"和"M!ss!ss!pp!"),并且引用str
指向replace()
方法之后的另一个对象?
我在不可变字符串上编写了以下代码.
public class ImmutableStrings {
public static void main(String[] args) {
testmethod();
}
private static void testmethod() {
String a = "a";
System.out.println("a 1-->" + a);
a = "ty";
System.out.println("a 2-->" + a);
}
}
Run Code Online (Sandbox Code Playgroud)
输出:
a 1-->a
a 2-->ty
Run Code Online (Sandbox Code Playgroud)
这里变量的值a
已经改变(许多人说不可变对象的内容不能改变).但究竟是什么意思说String
是不可改变的?你能否为我澄清一下这个话题?
来源:https://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html
import copy
a = "deepak"
b = 1, 2, 3, 4
c = [1, 2, 3, 4]
d = {1: 10, 2: 20, 3: 30}
a1 = copy.copy(a)
b1 = copy.copy(b)
c1 = copy.copy(c)
d1 = copy.copy(d)
print("immutable - id(a)==id(a1)", id(a) == id(a1))
print("immutable - id(b)==id(b1)", id(b) == id(b1))
print("mutable - id(c)==id(c1)", id(c) == id(c1))
print("mutable - id(d)==id(d1)", id(d) == id(d1))
Run Code Online (Sandbox Code Playgroud)
我得到以下结果 -
immutable - id(a)==id(a1) True
immutable - id(b)==id(b1) True
mutable - id(c)==id(c1) False
mutable - id(d)==id(d1) False
Run Code Online (Sandbox Code Playgroud)
如果我进行深度扫描 …