新手问题 怎么获取对象的字面值?

rubysir · 2016年03月03日 · 最后由 rubysir 回复于 2016年03月03日 · 2959 次阅读

比如:v = 'abc' v 这个字符串,就是 v 这个对象的字面值;而’abc‘则是变量 v 的值。二者不同。 我想要得到的是 v 这个变量的字面值。 比如有一个方法 m(v),传递参数是 v,那么 m(v) 就返回 v。那么这个 m 方法怎么定义呢? 或者说在某个对象上调用 m2() 方法,代码像这样:v.m2(),这句代码就返回 v; 如果在 f 这个变量上调用 m2() 方法,代码像这样:f.m2(),这句代码就返回 f. 我要请教的是,这个 m2() 方法怎么实现? 多谢! ---------重新说明---------------- 其实就是给 object 对象添加一个方法,比如叫做 literal();效果就是:在哪个变量上调用这个方法,就返回哪个变量的字面量。 代码如下: lass Object def literal #这里代码怎么写? end end

效果如下: a = 'abc' a.literal = 'a' #在对象 a 上来调用 literal 方法,就返回对象 a 的字面量,也就是字符串’a' 'abc'.literal = 'abc' #在对象‘abc'上来调用 literal 方法,就返回对象’abc‘的字面量,也就是字面量’abc' b = a b.literal = 'b' #b 对象虽然也指向字符串‘abc',但是以 b 对象来调用 literal 方法,所以返回 b 对象的字面量,即字符串’b' c = a.clone c.literal = 'c' #对象 c 的值虽然也是字符串‘abc',但是以 c 对象来调用 literal 方法,所以返回 c 对象的字面量,即字符串’c'

定义方法返回 self

def f.m2
  self
end

f.m2.equal?(f)   # => true

我知道了 lisp 系的语言有这个概念,ruby 没有吧?

#1 楼 @fighterleslie f = 'abc' def f.m2 self end pp f.m2 # =>"abc" 这里我要返回的是"f"这个字面量,不是要返回 f 的值!

#3 楼 @rubysir 不可能吧,变量 f 只是个指针而已

#3 楼 @rubysir 在你的这个例子里。“f" 的字面量是什么?

#6 楼 @zlx_star 我猜楼主的意思是返回字符串 "f"

#6 楼 @zlx_star f = 'abc' f 的字面量就是字符串‘f' 'abc’的字面量就是字符串‘abc' "f" 的字面量就是’f' 抱歉,是我没说清。实际上就是给 object 对象添加一个方法,比如方法名是 literal;那么当对象 a 来调用 literal 方法时,即:对象 a.literal() = ‘对象 a’

#8 楼 @rubysir 你的需求貌似就是 a.literal = 'a', b.literal = 'b' 在你调用的时候不是就是知道的吗?

class Objcet @_binding = binding def literal(b = @_binding) r = eval("local_variables",b).map{|e| e.to_s} t = self.object_id r.each do |v| t2 = eval("#{v}.object_id", b) return v if t == t2 end return nil end end 测试: f = [1,2,3] f.literal(binding) #=>'f' #在 f 变量上调用可以返回正确的结果 [1,2,3].literal(binding) #=>nil #直接在对象 [1,2,3] 上调用不能返回'[1,2,3]' f='abc' f.literal(binding) #=>'f' 'abc'.literal(binding) #=>nil #直接在对象'abc'上调用不能返回'abc' 不足之处:只能在变量上调用,能获得正确的结果;但不能直接在对象上调用,请各位完善!

#7 楼 @fighterleslie 请看 9 楼!请予以完善!

#11 楼 @rubysir

class Object
  @_binding = binding

  def literal(b = @_binding)
    r = eval("local_variables", b).map(&:to_s)
    t = object_id
    r.each do |v|
      t2 = eval("#{v}.object_id", b)
      return v if t == t2
    end

    return "#{self}"
  end
end

# test
f = [1, 2, 3]
puts f.literal(binding)     # => 'f'
puts [1, 2, 3].literal(binding)   # => "[1, 2, 3]"

然而这并没有什么用

# test
f = [1, 2, 3]
f2 = f
puts f2.literal(binding)   # => "f"

😄

#13 楼 @fighterleslie 这样的方法,会有些特殊的用法! 或者,其他编程语言,难以实现这样的方法! 感谢您完善和排版!

需要 登录 后方可回复, 如果你还没有账号请 注册新账号