论坛首页 编程语言技术论坛

Ruby是强类型语言吧?这个概念有什么问题吗?

浏览 10518 次
精华帖 (0) :: 良好帖 (5) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2009-05-03   最后修改:2009-05-03
被一个嵌入式经验超级丰富的人郁闷了。
他说Ruby是弱类型,然后不断拿他的嵌入式开发经验挖苦我。
问题是,至少谷歌的结果和我以前看过的一些文章告诉我Ruby是强类型的。

引用

某前辈  12:15:52
这叫运行期决定变量类型.明白
某前辈  12:16:09
因为你没有c,c++或是java基础.所以对强与弱你分不清楚


引用

我  12:04:15
要区分对象可变和对象的引用可变,两种概念。
我  12:04:36
php就是弱类型,因为它的对象可以自动转换的,Ruby不行。
我  12:05:02
所以php可以 a = "123" + 3 # 结果 126
我  12:05:08
但是Ruby和Python不行。
某前辈  12:05:22
呵呵.是你不懂吧?
我  12:05:32
http://www.google.com/search?hl=en&client=firefox-a&rls=org.mozilla%3Aen-GB%3Aofficial&hs=zBT&newwindow=1&q=ruby+strong+type&btnG=Search
我  12:05:45
自己Google,我找不到地方说Ruby是弱类型的。
某前辈  12:05:52
a = "abc"
p a
>> "abc"
a =1
p a
>> 1
我 12:06:00
引用变了,谢谢。
我  12:06:18
但是php可以把"123"当123来用。
我  12:06:26
Ruby不行。
某前辈  12:06:49
那可能是一个陷阱
我 12:06:51
各位大哥,Google一下吧,辩论这个没有意义。
我 12:07:14
区分一下动态语言和弱类型语言的差别就好。
某前辈  12:07:15
可能你没有学过c
某前辈  12:07:24
对这个东东的理解还有一些误区


引用

某前辈  12:25:12
那它有没有举例说明
x=124
p "hello #{x}"
这个例子呢?
我  12:27:28
x被转换成字符串了。
某前辈  12:27:41
这都知道.牛
我  12:29:30
在讽刺之余,可以解释一下你想表达的意思吗?
某前辈  12:30:21
php自动把字符转换成数字这是一个陷阱并不能拿它来和弱类型说事
某前辈  12:32:01
在c,c++,java,delphi....等等语言中.变量申明的是什么类型就是什么类型.使用的时候也要跟着一致
动态语言中的变量可以不申明就使用.运行期决定类型.


根据我有限的C基础,我觉得 a = "abc" 和 a = 1 这种,感觉就是两次声明,但是用了同一个变量罢了,不能因此就说Ruby是弱类型的。
   发表时间:2009-05-03  
额,duck type..
0 请登录后投票
   发表时间:2009-05-03  
Ruby是强类型的

C语言是典型的弱类型,某一个内存区域存放的对象究竟是什么,可以以不同方式进行解释,例如一个integer,你也可以把它当作指针,或者当作数组的第一个成员之类的

象Ruby这类强类型语言,某一块内存区域存放的如果是一个Fixnum,那么它决不会是,决不可能解释成为Bignum或者String或者其他什么对象

至于a=1等一下变成a="234",不是因为对同一块内存区域的解释从1变成了"234",而是因为a指向了另外一个对象.


0 请登录后投票
   发表时间:2009-05-03  

静态类型定义语言
一种在编译时,数据类型是固定的语言。大多数静态类型定义语言强制这一点,它要求你在使用所有变量之前要声明它们的数据类型。Java和C是静态类型定义语言。
动态类型定义语言
一种在执行期间才去发现数据类型的语言,与静态类型定义相反。VBScript和Python是动态类型定义的,因为它们是在第一次给一个变量赋值的时候找出它的类型的。
强类型定义语言
一种总是强制类型定义的语言。Java和Python是强制类型定义的。如果你有一个整数,如果不显示地进行转换,你不能将其视为一个字符串(在本章后面会有更多如何去做的内容)。
弱类型定义语言
一种类型可以被忽略的语言,与强类型定义相反。VBScript是弱类型定义的。在VBScript中,可以将字符串 '12' 和整数 3 进行连接得到字符串 '123',然后可以把它看成整数 123,而不需要显示转换。

 

关于一般的动态语言,例如Ruby、python此类语言都是强类型语言,他们所使用的类型不能在运行过程中变化。而看似“强”的C语言其实是个典型的弱类型,在C语言中,其实只有地址和数据两个概念,任何对数据的使用,你都可以强制取数据长度从而发生类型的变化。

这个其实是个概念问题。

非常感谢相关讨论,特别是那个前辈的话,分清楚应用和类型、明确概念。至于duck编程,个人感觉很好用,不过好像和这里的讨论还是不太符合的。如果在Ruby中"123"+3可以使用,那应该是String里面添加的相关支持(当然这里应该是程序员后期添加的)。

0 请登录后投票
   发表时间:2009-05-04   最后修改:2009-05-04
你们这些概念那里来的?
引用
可以将字符串 '12' 和整数 3 进行连接得到字符串 '123',然后可以把它看成整数 123,而不需要显示转换。


根本就不是强弱类型的含义所在,因为字符串"123"和整数123不可能是相同的内容,这只是一个简单的转换而已,就算强类型的语言照样可以这么做:
 class String 
  def +(obj)
      ""<<self<<obj.to_s
  end
 end
 "123"+1 => "1231"


如果举个C语言的例子,假设我有一个指针但是这个指针的值如果是0x8f8988,这个指针可能是一个数组的开头,那么我完全可以做两件事:
1. 把它当作指针,用*操作得到这个数组的成员
2. 把它当作整数,用加减乘除进行运算

它们运算的是同一个值






1 请登录后投票
   发表时间:2009-05-04  
potian 写道
你们这些概念那里来的?
引用
可以将字符串 '12' 和整数 3 进行连接得到字符串 '123',然后可以把它看成整数 123,而不需要显示转换。


根本就不是强弱类型的含义所在,因为字符串"123"和整数123不可能是相同的内容,这只是一个简单的转换而已,就算强类型的语言照样可以这么做:
 class String 
  def +(obj)
      ""<<self<<obj.to_s
  end
 end
 "123"+1 => "1231"


如果举个C语言的例子,假设我有一个指针但是这个指针的值如果是0x8f8988,这个指针可能是一个数组的开头,那么我完全可以做两件事:
1. 把它当作指针,用*操作得到这个数组的成员
2. 把它当作整数,用加减乘除进行运算

它们运算的是同一个值








学习了,原来是这样。
0 请登录后投票
   发表时间:2009-05-04  
我记得ruby的广告语中不是有这样一句么? 如果你喜欢lisp却不习惯满篇的括号...

抛开那些深奥的计算机理论, 我对lisp里变量的赋值是这样理解的: 变量名就是符号, 而符号本天成, 妙手偶得之, 信手拈来一个符号, 赋与它一个有意义的值(非nil), 这样看起来符号可以随意改变类型了.

至于类型的强弱, 是该讨论变量还是该讨论变量所指向的值呢?
0 请登录后投票
   发表时间:2009-05-04  
看一下ruby 的内核源代码就知道了。
0 请登录后投票
   发表时间:2009-05-06  
是强类型的,如果ruby不是,那么c++也不是。能不能自动转换并不能说明是强是弱。
如c++类
class A
{
int v;
public:
A(int v):v(v){}
operator int()
{
return v;
}
};

//那么我们也可以使用
cout<<(3+A(4))<<endl;
输出7 类A通过定义隐式的转换成了int

因为你的那位牛人一直接触嵌入式,用的是C语言,不具有面对对象的许多高级特性,所以造成了误解。

ruby和c++一样,不定义其转换方法是无法直接使用的。
0 请登录后投票
   发表时间:2009-05-14  
看看strong type和weak type, 以及static type和dynamic type的区别.
0 请登录后投票
论坛首页 编程语言技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics