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

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

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


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

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

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

应该是 @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'

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

匿名 #15 · 2013年02月26日

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 ,但还是不明白,求解

匿名 #24 · 2013年02月26日

#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) 来访问和变量同名的方法

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