2015-04-25 6 views
0
def gen_times(factor) do 
    return Proc.new {|n| n*factor} 
end 

gen_times.class # ArgumentError 0 for 1 
gen_times(3).class # Proc 
gen_times = 2 
gen_times.class # Fixnum 
times3 = gen_times(3) # A normal, working Proc 

Первый gen_times.class дает ArgumentError, поэтому я предполагаю, что он возвращает имя класса возвращаемого значения gen_times, что подтверждается в следующей строке.Локальные переменные и методы с тем же именем в Ruby?

Но тогда я назначаю gen_times, и он становится Fixnum. Тем не менее, я все еще могу использовать gen_times для возврата Procs.

Напомню, что объекты Fixnum имеют непосредственные значения и что сам объект используется в присваивании, а не как ссылка на него.

Итак, правильно ли сказать, что gen_times является объектом Fixnum, который ссылается на метод?

+0

Локальные переменные и локальные функции могут работать с одинаковыми именами. Чтобы четко различать их, можно было бы использовать скобки. – mudasobwa

+0

Мне нужно было прочитать это несколько раз, чтобы выяснить, о чем вы спрашиваете. Я думаю, было бы лучше, если бы вы показали результаты запуска кода внутри самого кода, либо в виде комментариев, либо в формате «Я пробовал это: ... и тогда это произошло: ... поэтому я попробовал это: ... и тогда это произошло: ... " –

ответ

0

В рубине вы можете иметь локальные переменные и методы с тем же именем. Это имеет некоторые осложнения, например, с помощью методов инкубационных в классах:

class Test 
    def active 
    @active 
    end 

    def active=(value) 
    @active = value 
    end 

    def make_active 
    active = true 
    end 
end 

t1 = Test.new 
t1.active = true 
t1.active #=> true 

t2 = Test.new 
t2.make_active 
t2.active #=> nil 

Код для объекта t1 будет возвращать ожидаемый результат, но код t2 возвращает NIL, потому что make_active метод фактически создает локальные переменный и не вызывая активный = метод. Для выполнения этой работы вам нужно написать self.active = true.

Когда вы пишете gen_class, ruby ​​пытается получить доступ к локальной переменной, если она не определена, ruby ​​пытается вызвать метод. Вы можете вызывать ваш метод явным путем записи gen_class().

Смежные вопросы