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

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

比如: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'

共收到 14 条回复

定义方法返回 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 这样的方法,会有些特殊的用法! 或者,其他编程语言,难以实现这样的方法! 感谢您完善和排版!

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