【问题标题】:Are strings generally considered objects?字符串通常被认为是对象吗?
【发布时间】:2016-08-30 01:31:26
【问题描述】:

我来自 Lua 和 Python 两种语言,它们都将它们的字符串值视为对象。我只是想知道,字符串值实际上被认为是对象吗?我的意思是,在 Lua 中你可以配置它们的元表并在它们上使用方法,而在 Python 中你可以直接说类似print("".format)

另一个示例(在 Lua 中)可能是向字符串值添加方法,如下所示:

#Prototype object
local proto = {}

function proto:print()
    print(self) -- "self" will be the string
end

#String's metatable
local mt = getmetatable("")
local index = mt.__index

#Direct nil references to the prototype object
setmetatable(index, { __index = proto })

#Create a string
local str = "hello"
str:print() #Call it's method

如预期的那样,一旦调用了“print”,上面的代码就会将字符串打印到输出窗口。那么字符串值对象和 Lua 中的任何其他数据结构一样吗? Python 和其他语言也一样吗? 除了它们是不同的数据类型之外,字符串对象和语言中的其他对象之间是否有任何显着差异?

感谢您的宝贵时间!

【问题讨论】:

  • “以及其他语言” - 不。一方面,并​​非所有语言都是面向对象的;所以“字符串是一个对象”对他们来说甚至没有意义。有些语言甚至没有字符串的概念(C 是一个显着的例子)。即使在 OO 语言中,也不一定是这样:例如,在 JavaScript 中,字符串是原始的,而不是对象,但如果您尝试对其使用方法,它会自动强制转换为对象包装器 String .
  • 一般 str 是一个内置类型,不能附加新属性(例如,不,你不能向它添加新方法)......但是有像forbiddenfruit 这样的东西可以让你@ 987654325@ 具有新属性的内置函数
  • @William:定义“对象”。该术语具有您在此处给出的更多含义。不同的语言赋予这个词不同的含义。
  • 你给出的 Lua 元方法示例很有趣。您实际上是将方法添加到“类”,而不是对象。

标签: python string oop object lua


【解决方案1】:

字符串不是对象。引用 Lua 手册:

Lua 中有八种基本类型:nil、boolean、number、string、 函数、用户数据、线程和表。 ....

表、函数、线程​​和(完整的)用户数据值都是对象: 变量实际上并不包含这些值,仅引用 他们。赋值、参数传递和函数返回总是 操纵对这些值的引用;这些操作并不意味着 任何类型的副本。

这句话

表、函数、线程​​和(完整的)用户数据值都是对象

表示只有这些是对象其余都是基本类型(原语)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-08
    • 2010-12-16
    • 2011-05-28
    相关资源
    最近更新 更多