变量一定要有类型吗(二)
变量一定要有类型吗?不一定。
在《The Ruby Way 2nd》一书中,1.2.3节 Constants, Variables, and Types
“In Ruby, variables do not have types, but the objects they refer to still have types. ” 在Ruby中,变量没有类型,但变量引用的对象有类型。
1.5.2节 Perspectives in Programming
“In Ruby, variables don't have classes; only values have classes.” Ruby里, 变量没有类别;只有值才有类别。
《The Ruby Way 2nd》所描述是真的吗?口说无凭,程序为证。
a=5
puts "a = #{a}, #{a.class}" # => a = 5, Fixnum
a="hh" # a: 5 --> "hh"
puts "a = #{a}, #{a.class}" # => a = hh, String
变量a只是一个符号,当a指向一个表达式的时候,那个表达式的值也许是Fixnum,也许是String。变量a并没有什么事先预定的类型;而且变量a在事后也不会固定在什么具体的类型上。
a = x==nil ? 2 : x**2 < x<<2 ? 2.0 : ""
puts a.class
你能告诉我,变量a是什么类型吗?你如果问我,我只能说:
假设x = 2,程序输出为Float;
假设x = 4,程序输出为String;
假如x 是一个无返回值的方法,程序输出为Fixnum。
Gödel在证明不完备性定理时,用一个正整数指代某个数值;用另一个正整数指代某个运算符;而且,公式也用正整数指代;定理也用正整数指代…正整数只是符号,数值、运算符、公式、定理有区别,正整数没有类型差别。
变量只是符号,变量没有类型你如果不能接受,那么,我们自小熟悉的正整数只是代表不同类事物的符号,也许会让你发疯。
完备性、一致性、可证性似乎与主题不相关,其实,计算机编程语言是形式数学的直接产物。最初的LISP语言哪里有变量类型的概念,从C一路走来,到C++,到Java,变量的概念中塞入了太多的东西。一个子类拥有许许多多的内容,它父类的父类,最初的根类,只是一个符号。
你也许认为,变量有类型拓展了我们表达事物的能力,可事实是,如今Java程序、C++程序所作的并没有超越Turing当初的构想。假如某个语言因为变量有类型而实现了智能化,请你一定,一定要mail me。
人们在编程语言的道路上行走了几十年,跌跌绊绊,缝缝补补,没能见到希望中的曙光。这一切的努力是有意义的,但也许应该回到起初的地方,认真审视,重新选择方向。Ruby是一个值得去做的尝试。
A). Rails框架充分发挥了Ruby的动态性,继承ActiveRecord时,数据库中的表将被映射为一个Ruby类,你不用操心字段值的类型。在Java及其上的框架中则作不到。
B).假设有一个Java EE 项目,几个人分别在PowerDesigner里定义了几百甚至上千张表,连接上数据库,PowerDesigner 帮你自动在库中生成了这些表;在Hibernate 里SessionFactory创建JDBC连接, MyEclipse 为你自动生成了每张表相应的JavaBean。你现在要将表中的内容显示在前端网页表格中,不是很难,可问题是,每个表有几个字段,十几个字段,甚至更多,你显示的时候不仅要考虑到getXXX(),还要顾及到返回类型,有些字段又没有定义缺省值,上万个字段实在是无休止的折磨。假设出现在生活中,你只能无奈地写一个Java类,定义成静态方法,是为了直接调用。都是类型惹得祸。
//package com.lilytech.hr.rsgl;
/*
* Created on 2006-4-21
*
*/
/**
* @author Kaichuan Zhang
*
*/
public class Wrap {
public static String tostring(Object obj){
try{
return (obj!=null)?obj.toString():"";
}catch(Exception err){
return "";
}
}
public static String tostring(long obj){
try{
return (new Long(obj)).toString();
}catch(Exception err){
return "";
}
}
public static String tostring(double obj){
try{
return (new Double(obj)).toString();
}catch(Exception err){
return "";
}
}
public static String tostring(boolean obj){
try{
return (new Boolean(obj)).toString();
}catch(Exception err){
return "";
}
}
}
一门语言的变量有无类型,对于其上的框架之影响,如你在A). 与B).比较中所见。
结语:像Java,C++这样的静态语言需要变量有类型。而对于Ruby这样的动态语言,变量未必需要有类型。
分享到:
相关推荐
首先,我们要理解**数据类型**。数据类型是C语言的基础,它定义了变量能够存储的数据种类。C语言的基本数据类型包括整型(如int)、浮点型(如float和double)、字符型(如char)和布尔型(bool)。此外,还有指针、...
str1 = "有喜欢的人一定要表白~你丑没关系,万一她瞎呢?" print(str1) ``` 此外,Python 还支持同时为多个变量赋相同的值,例如: ```python str1 = str2 = -1000 print(str1, type(str1), id(str1)) print(str2, ...
在统计学中,变量类型主要分为连续变量和分类变量(包括顺序变量和名义变量)。连续变量能够取任意实数值,如身高、体重等;分类变量则只能取特定的类别值,如性别、职业等。顺序变量作为分类变量的一种,能够表现出...
变量必须先声明后使用,遵循一定的命名规则,如首字母小写,驼峰命名等。 2. 数据类型:C#支持多种内置数据类型,包括: - 值类型:如整型(int、short、byte)、浮点型(float、double)、布尔型(bool)、字符型...
#### 二、全局变量命名规范 对于全局变量(即在整个项目中可见的变量),建议采用前缀`g_`开头。这样做的好处在于能够清晰地区分出这些变量的作用域,便于阅读和维护代码。 **示例:** ```cpp // 全局变量示例 int...
变量类型是编程语言中非常重要的一个概念,全局变量、局部变量、静态变量都是程序员经常使用的变量类型,但是这些变量类型之间的区别和联系却经常让人感到困惑。今天我们将详细地探讨这些变量类型之间的区别和联系,...
根据这些修饰符,整型变量可以分为6种类型,分别是:有符号整型、无符号整型、有符号短整型、无符号短整型、有符号长整型和无符号长整型。 浮点型数据,如单精度浮点数(float)和双精度浮点数(double),在内存中...
二、动态变量的类型 在VB中,动态变量默认类型是`Variant`,这意味着它可以存储任何类型的数据,包括数值、字符串、对象等。但也可以通过指定类型来声明动态变量,如`Dim myNumber As Integer`声明一个整型变量。 ...
第二章“C++变量”是学习编程的重要基础,尤其对于初学者来说。本课件旨在深入浅出地解释C++变量的概念、类型、声明、初始化以及使用方法。 1. 变量的概念: 变量可以被看作是程序中的一个存储位置,它具有特定的...
在Python编程语言中,变量和数据类型是基础且至关重要的概念,它们构成了程序的基础框架。本章将深入探讨Python中的变量和数据类型。 首先,我们来看Python变量。变量在程序中扮演着存储和检索信息的角色。在Python...
### JavaScript中的变量与数据类型 #### 一、变量的概念与作用 在JavaScript中,变量扮演着极其重要的角色,它是用于存储数据值的容器。通过变量,开发者能够在程序中引用和操作这些值,使得代码变得更加灵活和可...
2. **减少错误:**有助于开发者正确地使用变量,减少因类型误用而导致的编程错误。 3. **提高可维护性:**对于较小规模的项目或函数,特别是涉及界面编程时,匈牙利命名法可以增加代码的可读性和可维护性。 **缺点...
单臂二分类变量的Meta分析是一种统计方法,用于整合多个独立研究的结果,以评估单一干预措施或暴露对二分类结局(如疾病发生与否、生存状态等)的影响。在医学研究中,这种分析常用于汇总小样本量研究的结果,增强...
- 结构体类型变量的定义有三种方式: 1. **先定义结构体类型,再定义结构体变量:** ```c struct Student student1, student2; ``` 2. **在定义结构体类型的同时定义结构体变量:** ```c struct Student { ...
为了充分利用这些源码,你需要对MATLAB编程有一定了解,特别是函数句柄和优化工具箱的使用。同时,理解优化理论和约束条件的数学表述也至关重要。你可以通过运行这些示例,观察它们的输出结果,逐步掌握`fmincon`的...
在易语言中设置全局变量,可以使用“定义全局变量”命令,指定变量名和类型。全局变量可以在程序的不同部分进行读写操作,从而实现数据的共享。 1. 定义全局变量:在易语言中,可以使用“定义”关键字来声明全局...
遵循一定的命名规则有助于: 1. **增强代码的可读性**:清晰的变量名可以立即传达其用途或所存储数据的性质。 2. **提高代码的可维护性**:当项目团队中有多个开发者参与时,统一的命名约定确保每个人都能迅速理解...
第二个例子是“WordToBoolAT”FB块,它可以从一个Word类型输入变量中提取16个BOOL类型的信号。输入变量“conveyor”的内容传递给“statConveyor”,然后“statMotors”覆盖“statConveyor”,最后,每个“statMotors...
在JavaScript中,变量命名有着一定的规范和推荐的最佳实践,这对于代码的可读性和维护性至关重要。 ##### 1. 命名规则 - **首字符限制**:变量名的第一个字符必须是字母、下划线`_`或者美元符号`$`。 - **后续字符...