新手问题 今天小测了同学们一个基本概念

ShiningRay · 2013年02月26日 · 最后由 KoALa 回复于 2013年02月26日 · 3232 次阅读

测试了实习生,甚至连几个同事还不清楚,题目如下


class A
  attr_accessor :b
  def test
     b='test'
  end
end

a = A.new
a.test
puts a.b

请问最后输出结果是什么,不少人以为是‘test'

共收到 27 条回复

应该是 @b='test' 吧,是不是写漏了?

class A
  def b
    @b
  end

  def b= var
    @b = var
  end

  def test
     b='test'
  end
end

该输出啥就输出啥啊

nil啊。。。。

这个和概念什么无关吧。。

你想说明的是什么? b = 'test' 是对函数作用域内的临时变量赋值,并不是对 @b 进行操作。

函数的闭包吧~

#7楼 @flypiggys 这里没涉及闭包

self.b = xx

test里面的b是局部变量,跟外面的b不一样,所以输出应该是nil

这题不脑残么...

#11楼 @bhuztez 但还是有人错啊

我不觉得,你考了别人什么概念? 一般第一反应,会认为你写错了吧?是不是应该是 @b='test'

第一反应也是楼主写错了……

nil attr_accessor :b 只定义了@b的存取,而不是b

第一反应是楼主忘写 self 了

#12楼 @ShiningRay

我现在觉得FizzBuzz都比你这题好了...

http://c2.com/cgi/wiki?FizzBuzzTest

这叫“大家来找碴”

考的就是作用域嘛

class A
  attr_accessor :b
  def test
     @b='test'
  end
end
a = A.new
a.test
puts a.b

这么写得出的应该就是 "test" 不好意思,我也在找实习。还请指教…

#13楼 @outman 对么,正常应该是知道写错了么。这不是考实习生么

@ShiningRay 我测了一下,没有任何输出,但如果最后一句改为 p a.b则输出nil,这是怎么回事呢,查到一篇文章 http://blog.chinaunix.net/uid-21843387-id-3294617.html ,但还是不明白,求解

#23楼 @igordonshaw http://ruby-doc.org/core-2.0/Kernel.html#method-i-p p 是调用参数的inspect方法,将其以字符串的形式输出

大家好,关于这个问题我也有点不明白...

class A
  attr_accessor :b
  def initialize
     @b = 2
  end
  def test
     b
  end
end

a = A.new
puts a.test

为啥这时候test方法中的b就和self.b是一个值了呢?

#25楼 @KoALa 因为你没有这个本地变量,所以就认为是方法调用了。 如果方法调用优先的话你是没办法调用和方法名同名的本地变量(get_variable除外) 现在是如果有本地变量的话会认为你是在访问本地变量,这样你还可以通过对象(self)来访问和变量同名的方法

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