2015-02-05 4 views
1

Я пытаюсь понять поведение ниже:Что происходит, когда имя метода и имя блока одинаковы?

def test 
    puts "In Method" 
end 

test 
#=> In Method 

test {puts "In Block" } 
#=> In Method 

Моя интерпретация является то, что test является метод и я передаю {puts "In Block"} в качестве аргумента этого метода. Поскольку метод не использует аргумент, он печатает значение по умолчанию "In Method". Это правильно?

Как мы можем различать вызов блока и метода? Может ли test {puts "In Block"} также интерпретироваться как блок? Есть yield единственный способ выполнить блок кода?

+0

Название не имеет отношения к вопросу. – sawa

+0

Думаю, вы его уже редактировали! Благодарю. – Zack

+0

Я исправил грамматические ошибки в названии, но оставил контент как есть. Вы должны исправить это. – sawa

ответ

5

Поскольку метод не использует [блок], то печать по умолчанию «В методе». Это правильно?

Нет, вы ошибаетесь. Он печатает "In Method", потому что вы определили метод для этого.

Является ли выход единственным способом выполнения кода?

Нет, вы можете принять блок как процедурный с помощью & и вызовите call на него.

def foo &block 
    block.call(arguments) 
end 
+0

Да. Это то, что я имел в виду. Поскольку я не передаю какой-либо аргумент, он выполняет значение по умолчанию - согласно определению метода. – Zack

+1

Слово «по умолчанию» означает то, что переопределено (отменено) при определенных обстоятельствах. Строка 'puts ...' в определении вашего метода никоим образом не отменяется; он всегда выполняется. – sawa

+0

Хорошо. Мой другой вопрос: «Является ли выход единственным способом выполнения кода?» – Zack

1

Как sawa описал вас, почему "In Method" напечатан как определено в методе. Если вы хотите передать аргумент методу, вы должны инициализировать параметр для принятия аргумента.

Что-то вроде этого ..

def test message 
    puts "I am in method" 
    puts message 
end 

test("In Block") 

Примечание: метод не принимает блок в качестве аргумента. Просьба пройти через эту ссылку эталонной, которая заставит вас понять весь синтаксис с примером: Ruby Programming/Syntax/Method Calls

+0

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

+0

Мое мнение состояло в том, что оно никоим образом не является дефолтом. – sawa

+0

пустое место было удалено ... Это была ошибка типографии –

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