`
凌川__
  • 浏览: 84079 次
  • 性别: Icon_minigender_1
最近访客 更多访客>>
社区版块
存档分类
最新评论

变量一定要有类型吗(二)

阅读更多
变量一定要有类型吗(二)



变量一定要有类型吗?不一定。

在《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)。此外,还有指针、...

    python变量以及数据类型

    str1 = "有喜欢的人一定要表白~你丑没关系,万一她瞎呢?" print(str1) ``` 此外,Python 还支持同时为多个变量赋相同的值,例如: ```python str1 = str2 = -1000 print(str1, type(str1), id(str1)) print(str2, ...

    【060期】李克特量表的变量属于顺序变量,为什么可以当作连续变量使用?.docx

    在统计学中,变量类型主要分为连续变量和分类变量(包括顺序变量和名义变量)。连续变量能够取任意实数值,如身高、体重等;分类变量则只能取特定的类别值,如性别、职业等。顺序变量作为分类变量的一种,能够表现出...

    C#基础变量与数据类型的文档

    变量必须先声明后使用,遵循一定的命名规则,如首字母小写,驼峰命名等。 2. 数据类型:C#支持多种内置数据类型,包括: - 值类型:如整型(int、short、byte)、浮点型(float、double)、布尔型(bool)、字符型...

    C++编程变量命名规范

    #### 二、全局变量命名规范 对于全局变量(即在整个项目中可见的变量),建议采用前缀`g_`开头。这样做的好处在于能够清晰地区分出这些变量的作用域,便于阅读和维护代码。 **示例:** ```cpp // 全局变量示例 int...

    全局变量、局部变量、静态变量即内存管理

    变量类型是编程语言中非常重要的一个概念,全局变量、局部变量、静态变量都是程序员经常使用的变量类型,但是这些变量类型之间的区别和联系却经常让人感到困惑。今天我们将详细地探讨这些变量类型之间的区别和联系,...

    变量与基本数据类型PPT学习教案.pptx

    根据这些修饰符,整型变量可以分为6种类型,分别是:有符号整型、无符号整型、有符号短整型、无符号短整型、有符号长整型和无符号长整型。 浮点型数据,如单精度浮点数(float)和双精度浮点数(double),在内存中...

    VB 动态变量举例

    二、动态变量的类型 在VB中,动态变量默认类型是`Variant`,这意味着它可以存储任何类型的数据,包括数值、字符串、对象等。但也可以通过指定类型来声明动态变量,如`Dim myNumber As Integer`声明一个整型变量。 ...

    c++第二章变量_c++变量课件_

    第二章“C++变量”是学习编程的重要基础,尤其对于初学者来说。本课件旨在深入浅出地解释C++变量的概念、类型、声明、初始化以及使用方法。 1. 变量的概念: 变量可以被看作是程序中的一个存储位置,它具有特定的...

    第3章 python变量和数据类型.pptx

    在Python编程语言中,变量和数据类型是基础且至关重要的概念,它们构成了程序的基础框架。本章将深入探讨Python中的变量和数据类型。 首先,我们来看Python变量。变量在程序中扮演着存储和检索信息的角色。在Python...

    JavaScript:变量与数据类型

    ### JavaScript中的变量与数据类型 #### 一、变量的概念与作用 在JavaScript中,变量扮演着极其重要的角色,它是用于存储数据值的容器。通过变量,开发者能够在程序中引用和操作这些值,使得代码变得更加灵活和可...

    C语言变量命名规则该PDF档详细描述了C语言下变量的命名规律

    2. **减少错误:**有助于开发者正确地使用变量,减少因类型误用而导致的编程错误。 3. **提高可维护性:**对于较小规模的项目或函数,特别是涉及界面编程时,匈牙利命名法可以增加代码的可读性和可维护性。 **缺点...

    17.1单臂二分类变量Meta分析资料下载.rar

    单臂二分类变量的Meta分析是一种统计方法,用于整合多个独立研究的结果,以评估单一干预措施或暴露对二分类结局(如疾病发生与否、生存状态等)的影响。在医学研究中,这种分析常用于汇总小样本量研究的结果,增强...

    c语言结构体变量课件

    - 结构体类型变量的定义有三种方式: 1. **先定义结构体类型,再定义结构体变量:** ```c struct Student student1, student2; ``` 2. **在定义结构体类型的同时定义结构体变量:** ```c struct Student { ...

    MATLAB源码集锦-fmincon所有约束加二维自变量轨迹

    为了充分利用这些源码,你需要对MATLAB编程有一定了解,特别是函数句柄和优化工具箱的使用。同时,理解优化理论和约束条件的数学表述也至关重要。你可以通过运行这些示例,观察它们的输出结果,逐步掌握`fmincon`的...

    易语言源码易语言汇编设置全局变量源码.rar

    在易语言中设置全局变量,可以使用“定义全局变量”命令,指定变量名和类型。全局变量可以在程序的不同部分进行读写操作,从而实现数据的共享。 1. 定义全局变量:在易语言中,可以使用“定义”关键字来声明全局...

    变量的命名约定

    遵循一定的命名规则有助于: 1. **增强代码的可读性**:清晰的变量名可以立即传达其用途或所存储数据的性质。 2. **提高代码的可维护性**:当项目团队中有多个开发者参与时,统一的命名约定确保每个人都能迅速理解...

    STEP 7 (TIA 博途) 中怎样通过关键字 AT 实现变量覆盖.docx

    第二个例子是“WordToBoolAT”FB块,它可以从一个Word类型输入变量中提取16个BOOL类型的信号。输入变量“conveyor”的内容传递给“statConveyor”,然后“statMotors”覆盖“statConveyor”,最后,每个“statMotors...

    JavaScript变量

    在JavaScript中,变量命名有着一定的规范和推荐的最佳实践,这对于代码的可读性和维护性至关重要。 ##### 1. 命名规则 - **首字符限制**:变量名的第一个字符必须是字母、下划线`_`或者美元符号`$`。 - **后续字符...

Global site tag (gtag.js) - Google Analytics