什么时候应该劝阻弱势群体?在大型项目中,弱势类型是否会受到阻碍?如果左侧是强类型,如下所示,那将是规则的例外吗?
int i = 5
string sz = i
sz = sz + "1"
i = sz
是否有任何语言支持与上述类似的语法?告诉我更多关于弱相关类型和情况的利弊。
答案 0 :(得分:16)
答案 1 :(得分:3)
弱打字是语言简化的尝试。虽然这是一个有价值的目标,但弱打字是一个糟糕的解决方案。
COM变种中使用的弱类型是解决这个问题的早期尝试,但它充满了危险并且坦率地引起了比它的价值更多的麻烦。即使是那些忍受各种垃圾的Visual Basic程序员也正确地认为这是一个坏主意,并将微软的ETC(扩展类型转换)付诸于Evil Type Cast。
不要将推断的打字与弱打字混淆。推断类型是在编译时从上下文推断的强类型。一个很好的例子是var
关键字,在C#中用于声明一个适合接收LINQ表达式值的变量。
相比之下,每次评估表达式时都会推断弱类型。这在问题的示例代码中说明。另一个例子是在C中使用无类型指针。非常方便但是乞求麻烦。
推断打字解决了与弱打字相同的问题,没有引入与弱打字相关的问题。因此,只要主语言可用,它就是首选替代方案。
答案 2 :(得分:2)
他们几乎总是气馁。我能想到的唯一类型的代码是需要一些指针巫术的低级代码。
为了回答你的问题,C支持这样的代码(当然除了没有字符串类型),这听起来像PHP或Perl会有的东西(但我可能完全错了)。
答案 3 :(得分:2)
“
什么时候应该劝阻弱势群体?是否劝阻弱势群体 大项目?如果左侧是强类型,如下所示 这会是规则的例外吗?
int i = 5 string sz = i sz = sz + "1" i = sz
是否有任何语言支持与上述类似的语法?告诉我更多 关于弱相关类型和情况的利弊。
“
也许你可以编写自己的图书馆来做到这一点。
在C ++中,您可以使用称为“运算符重载”的东西,这意味着您可以将一种类型的变量声明为另一种类型的变量。这就是声明的原因:
[std::string str = "Hello World";][1]
具体来说,您将定义一个函数(其中变量的类型为T,B是您要将其设置为的类型)
工作,即使引号之间的任何文本都被解释为字符数组。
T& T::operator= ( const B s );
请注意,这是班级的会员功能 另请注意,如果您想要自由使用它,您可能希望有某种功能可以反转这种操作 - 类似于
B& T::operator= ( const T s);
C ++足够强大,允许你创建一个通常弱类型的对象,但如果你想把它简单地称为弱类型,你只需要制作一个可以用作任何原语的单一变量类型,并且只使用它将指针指向void的函数。 相信我,使用强类型编程会更容易。
我个人更喜欢强类型,因为当我不知道变量是什么意思时,我不需要担心会出现的错误。例如,如果我想写一个与人交谈的功能 - 而且该功能使用了人的身高,体重,姓名,孩子数等等 - 但是你给了我一个颜色,我会得到一个错误,因为你可以使用非常简单的算法确实可以确定颜色的大部分内容。
就弱类型的优点而言,如果要编程在程序中运行的东西(即Web浏览器或UNIX shell),您可能希望习惯松散类型的编程。 JavaScript和Shell脚本的类型很弱。
我建议像汇编语言这样的编程语言是唯一的硬件级弱类型语言之一,但我见过的汇编语言的味道会根据分配的大小(即单词)为每个变量附加一个类型, dword,qword。
我希望我给你一个很好的解释,并没有在你的嘴里说任何话。
答案 4 :(得分:1)
弱类型本质上不如强类型强大,因为您不会告诉机器到底该做什么 - 而是机器必须弄清楚您的意思。这通常很有效,但一般来说不清楚结果应该是什么。例如,字符串乘以float?
答案 5 :(得分:1)
是否有任何语言支持与上述类似的语法?
Perl允许您互换地处理一些数字和字符串。例如,“5”+“1”会给你6.这类事情的问题一般是难以避免歧义:“5”+ 1应该是“51”还是“6”? Perl通过为字符串连接提供单独的运算符来解决这个问题,并为数字加法保留+。
其他语言必须弄清楚您是要进行连接还是添加,以及(如果相关)结果将是什么类型或表示。
答案 6 :(得分:0)
我做了ASP / VBScript编码并使用遗留代码而没有“选项严格”,这允许弱输入。
这在很多时候都是地狱,特别是在经验不足的程序员手中。我们得到了所有愚蠢的错误需要很长时间来诊断。
其中一个愚蠢的例子是这样的:
'Config
Dim pass
pass = "asdasd"
If NOT pass = Request("p") Then
Response.Write "login failed"
REsponse.End()
End If
到目前为止一切都很好但是如果用户更改传递给整数密码,请猜测它不再起作用,因为int pass!= string pass(来自querystring)。我认为它应该可以工作,但它没有我不记得确切的代码。
我讨厌弱类型,而不是愚蠢的调试会话我可以花费额外的秒来输入确切类型的变量。
简单地说,根据我的经验,特别是在大型项目中,特别是对于没有经验的开发人员来说,这只是麻烦。