2016-06-27 2 views
0

В JavaScript мы можем сделать этоНазначение функции в переменной

var c = { 

    firstname: "Bob", 
    lastName: "Smith" 
    log: function() 
    { 
     return "Hey" + this.firstname + " " + this.lastName; 
    } 

}; 

Можем ли мы сделать что-нибудь подобное в рубин? I.E, в которое входит использование «Это», а также мы можем складывать функции внутри переменной? Я новичок в рубине, но особенность «хэшей» кажется ужасно подобной в некотором смысле

ответ

3

Хеш-объекты не имеют доступа к родительскому хешу и, следовательно, к вложенным братьям-сиротам. То, что вы ищете, - это класс.

class MyClass 
    def initialize 
    @first_name = "Bob" 
    @last_name = "Smith" 
    end 

    def log 
    "Hey #{@first_name} #{@last_name}" 
    end 
end 

MyClass.new.log 
#⇒ "Hey Bob Smith" 

Я считаю, что имеет смысл читать книгу о синтаксисе Ruby и/или базовых концепциях, прежде чем пытаться играть.

-2

В рубине есть концепция Proc and Lambda, которая аналогична.

Пример:

def create_lambda 
    lambda { "You're looking at me?" } 
end 

some_var = create_lambda 
some_var.call #=> "You're looking at me?" 

Вы также можете передать параметры:

def create_square 
    lambda { |base| base * base } 
end 

square = create_square 
square.call(4) # => 16 

Имейте в виду, однако, что лямбды, ни прока, принимать необязательные аргументы, вы всегда должны дать им именно те вы определили.

В вашем примере хеш нельзя ссылаться до его создания.

Так, для примера, вы можете сделать:

my_hash = { 
    firstname: "Bob", 
    lastName: "Smith" 
} 

my_hash['log'] = lambda { "Hey #{my_hash['firstname']} #{my_hash['lastName']}" } 

my_hash['log'].call #=> "Hey Bob Smith" 
+0

Примечание 'this' использование в данном примере. В procs нет «этого» аналога, они выводят самый внешний контекст. И, кстати, 'return' это запах кода. – mudasobwa

+0

Право, я был слишком глубоко в мышлении javascript. – Dervol

0

вы можете попробовать STRUCT

require 'ostruct' 

Person = Struct.new(:firstname, :lastName) do 
    def log 
     "Hey" + self.firstname + " " + self.lastName 
    end 
end 

person = Person.new('Bob', 'Smith') 
puts person.log 
Смежные вопросы