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

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

阅读更多
先讨论一下Ruby是不是强类型。


1).在《Beyond Java》September 2005 一书  6.1.2节Typing  中,Bruce Tate举例
     irb(main):015:0> "fish"+4
    TypeError: cannot convert Fixnum into String
            from (irb):15:in‘+’
              from (irb):15
从而得出结论:
引用
That means Ruby is strongly typed.


我们知道,Ruby是动态语言,在运行中边解释、边检测、边执行,检测类型匹配吗?不是检测类型匹配,而是检测语法。
String类的‘+’是一个方法,但是,Ruby从来不拒绝你重写方法。
class String
  alias : old_plus :+
  def +(other)
    self.old_plus(other.to_s)    
  end  
end

puts "fish"+4       # => fish4
puts '1 ' + 2.3      # => 1 2.3



2).Bruce Tate 在“跨越边界: Java 模型以外的类型策略”2006 年 6 月 一文中写到:
引用
...这两种语言都 倾向于 强类型...


这两种语言是指Java和 Ruby,他给出了一行Ruby代码来说明;

1 + "hello"
会收到以下错误消息:
TypeError: String can't be coerced into Fixnum
        from (irb):3:in '+'
        from (irb):3


字面值1是Fixnum类的实例对象,让我们重写Fixnum类的‘+’方法,使得‘+’的语法不再出错;

class Fixnum
  alias : old_plus :+
  def +(other)
    (other.class.eql?String) ? (self.to_s << other) : (old_plus(other))    
  end  
end

puts  1 + "hello"  # => 1hello
puts  1 + " 2.3"   # => 1 2.3




3). Ruby是简单的,我们可以只管按照别人说的去使用;Ruby也是灵活而复杂的,我们可以按照自己的需求去使用;
require "another_plus3"

puts  'he'+1        # => he1
puts '1.5'+2        # => 3.5
puts 1+" he"        # => 1 he

puts 1 + " 2.3"    # => 3.3
puts 1 + 2.3      # => 3.3

puts 1.6 * "2.7"   # => 4.32
puts 1 -"2.3"    # => -1.3

类型错误根本不存在,如果语法错误算是强类型,我无言。Bruce Tate是大牛,他断言Ruby是强类型,国内的牛们也跟着如是说。
在1).中, Bruce Tate断言Ruby是强类型;
在2).中, Bruce Tate认为Ruby 倾向于 强类型。

后文“变量一定要有类型吗(二)”将更进一步说明。


#another_plus3.rb

class String

  alias : old_plus :+
  def +(other)    
    (Float(self)) + (Float(other))  rescue  (self.to_s).old_plus(other.to_s)     
  end  
  
  def coerce(other)
    case other
      when Integer : return other, Integer(self)  rescue  return Float(other), Float(self)
      when Float : return other, Float(self)
      else super
    end
  end
  
end

class Fixnum
  alias : old_plus :+
  def +(other)
    (other.class.eql?String)?(old_plus(Float(other)) rescue self.to_s<<other):(old_plus(other))      
  end  
end

class Float
  alias : old_plus :+
  def +(other)
    (other.class.eql?String)?(old_plus(Float(other)) rescue self.to_s<<other):(old_plus(other))    
  end  
end


========
题外话

假设若干年后,有一篇搜索引擎报告指出:
A)21世纪初期,网络信息以中文和英文居多;
B)其中中文信息多数是英文信息的跟风之作,
从发布时间得出,英文信息居前;
从信息不确切度得出,中文信息没有经过中文世界的思维、理解与吸收,英文信息如何错误,中文信息也有相似度极高的错误...
...

我衷心地希望与你,一起唱和出中文技术论坛自身的弦音。
分享到:
评论
6 楼 whisper 2007-03-02  
从lambda演算的角度说
我们并不关心一个东西到底是什么,而只看作一个符号
并定义符号之上的函数
然后将函数看作符号,并称为算子
在定义作用于算子上的算子,获得高阶函数

类型系统是个数学概念
咱们搞编程的明不明白不重要
5 楼 wiwolf 2007-03-01  
这个问题还需要讨论啊!...无语了...
4 楼 dustinth 2007-03-01  
假设若干年后,有一篇搜索引擎报告指出:
A)21世纪初期,网络信息以中文和英文居多;
B)其中中文信息多数是英文信息的跟风之作,
从发布时间得出,英文信息居前;
从信息不确切度得出,中文信息没有经过中文世界的思维、理解与吸收,英文信息如何错误,中文信息也有相似度极高的错误.

这真是让我喷饭, 又是"国人自强论", 鬼子们在科学技术方面的统治地位是勿庸置疑的, 不会因为我们叫口号而改变. 只有竭力追赶上咱们才有叫板的资格.
3 楼 aardvark 2007-03-01  
more:

http://en.wikipedia.org/wiki/Type_system#Strong_and_weak_typing

http://en.wikipedia.org/wiki/Comparison_of_programming_languages

2 楼 aardvark 2007-03-01  
你混淆了强类型/弱类型和静态类型/动态类型。

http://en.wikipedia.org/wiki/Strong_typing

1 楼 凌川__ 2007-03-01  
变量一定要有类型吗(二)



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

在《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这样的动态语言,变量未必需要有类型。

相关推荐

    DELPHI Variant变量的使用技巧

    实际上,variant变量中不仅包含了数据还包含有类型信息,并允许一系列运行时间操作,这些操作很方便,但运行速度慢且安全性差。 见例VariTest,它是上面代码的扩展。窗体上有三个编辑框,一对按钮,第一个按钮的...

    python中可以声明变量类型吗

    在Python语言中,声明变量的同时需要为其赋值,毕竟不代表任何值的变量毫无意义,Python语言中也不允许有这样的变量。 声明一个变量也非常简单,语法结构如下: variable_name = variable_value 等号(=)左侧是...

    C语言程序设计-变量.pptx

    变量名:每个变量都必须有一个名字。变量的命名应遵循标识符的命名规则。 变量值:变量在程序运行过程中,占据一定的内存存储单元,用来存放变量的值。不同类型的变量所占用的内存单元的大小不同,变量值随着变量...

    C# 变量相关基础知识.docx

    在C#中,变量的命名需要遵循一定的规则,如不能以数字开头,不能使用保留关键字等。声明变量时,可以同时初始化变量的值,也可以在后续的代码中赋值。C#中的变量可以是局部变量、成员变量、静态变量等,具有不同的...

    C语言程序设计-地址、指针和变量.pptx

    若我们在程序中定义了一个变量,C编译系统就会根据定义的变量的类型为其分配一定字节数的内存空间(如:字符型占1个字节,整型占2字节,单精度实型占4字节,双精度实型占8字节)。每个变量所占存储单元的第一字节的...

    变量的存储类型

    作者:曾宏安,华清远见嵌入式学院讲师。  我们在程序中会经常定义一些变量来保存和处理数据。从本质上看,变量代表了一段可操作的...一、在程序运行时内存中有三个区域可以保存变量:静态存储区、栈(stack)和堆(he

    PL/SQL 基础.doc

    2) 如有[CONSTANT][NOT NULL], 变量一定要有一个初始值; 3) 赋值语句为“:=”; 4) 变量可以认为是数据库里一个字段; 5) 规定没有初始化的变量为NULL; ---- 第三章 变量与数据类型 ---- 1. 数据类型 1) ...

    C语言程序设计-枚举类型.pptx

    枚举类型 5-1 枚举类型的定义 有些变量的取值仅限于可一一列举出来的几个固定值。...如果一定要把数值赋予枚举变量,那么必须用强制类型转换,如a=(enum weekday)2;的意义是将顺序号为2的枚举元素赋予枚举变

    Linux字符设备驱动(转载)

    概括的说,字符设备驱动主要要做三件事:1、定义一个结构体static struct file_operations变量,其内定义一些设备的打开、关闭、读、写、控制函数;2、在结构体外分别实现结构体中定义的这些函数;3、向内核中注册或...

    c++面试题题目集锦

    指针在定义的时候不一定要初始化,并且指向的空间可变。(注:不能有引用的值不能为NULL) 3)有多级指针,但是没有多级引用,只能有一级引用。 4)指针和引用的自增运算结果不一样。(指针是指向下一个空间,引用时...

    阿里规范:为何boolean类型变量命名禁用is开头

    主要给大家介绍了关于阿里规范:为何boolean类型变量命名禁用is开头的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

    详解C++编程中的变量相关知识

    一个变量应该有一个名字,并在内存中占据一定的存储单元,在该存储单元中存放变量的值。请注意区分变量名和变量值这两个不同的概念,见图 变量名规则 先介绍标识符的概念。和其他高级语言一样,用来标识变量、符号...

    matlab 产生高斯随机粗糙面的函数 输入变量为点数 长度 相关长度 均方根高度

    【达摩老生出品,必属精品,亲测校正,质量保证】 资源名:matlab 产生高斯随机粗糙面的函数 输入变量为点数 长度 相关长度 均方根高度 资源类型:matlab项目全套源码 ...适合人群:新手及有一定经验的开发人员

    详解c++ 静态成员变量

    对类型而言,声明不一定能知道其对象占用空间大小,但根据定义肯定能确定内存占用。说静态成员与C++方式是相容的,因为其初始化方式与方法的定义一致。下面是一个例子: // Foo.hpp namespace tlanyan { // 类声明...

    python基础知识(一)变量与简单数据类型详解

    主要介绍了python变量与简单数据类型详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

    WMLScript语言基础(语法,函数,变量,操作)

    基本原则 变量与数据类型 总的来说,由于WMLScript是以C语言为蓝本制定的,因此其语法特征和C语言很相象。在学习的过程当中,可以参考C语言。 本节介绍WMLScript 中的两个重要概念:变量和数据类型。 ...

    C学习深入学习总结

    7.3 动态申请内存一定要释放,否则会内存泄露。你是否使用过内存检测工具? 10 8 字符串 10 8.1 strlen()函数的返回值是什么类型的? 10 8.2 字符串strlen() 的值,是否和他占据的内存空间相同? 10 8.3 你是否知道...

    随机变量的分布类型对可靠度指标及失效概率的影响研究 (2009年)

    在工程结构可靠性设计中,同一个功能函数由于其随机变量的分布类型的不同,所求得的可靠度指标值往往也会不同。为了进一步研究随机变量的分布类型对可靠度指标和失效概率的具体影响,首先简要地介绍了验算点法(JC法)的...

    c语言入门教程.txt

    由于数值的类型有多种,有整数、小数(浮点数)、字符等等,那么对应的变量就有整型变量、浮点型变量、字符型变量。变量还有其他的具体分类。整型变量还可具体分为无符号型、长整型和短整型。浮点型也可分为单精度型...

    Python学习教程:简明易懂的入门指南.pptx

    在Python中,变量的命名需要遵循一定的规则,同时要避免一些常见的错误和陷阱。 3. 数据类型和变量是密不可分的,在Python中我们需要将数据存储在变量中,并指定对应的数据类型,数据类型和变量的使用是密切相关的。...

Global site tag (gtag.js) - Google Analytics