Форум программистов, компьютерный форум, киберфорум
Ruby
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.73/11: Рейтинг темы: голосов - 11, средняя оценка - 4.73
11 / 11 / 8
Регистрация: 06.01.2018
Сообщений: 134

Ошибка вызова метода для блока с параметром

25.02.2018, 16:06. Показов 2148. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
source_file.rb:18:in `<main>': undefined method `power' for main:Object (NoMethodError)
Ruby
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#протоколирование
def log s, someProc
    puts "Начинаю выполнять \"#{s}\"..."
    someProc.call
    puts "...\"#{s}\" закончен."
    puts "Результат: #{@x}"
end
power = Proc.new do |x|
    @x**=3
end
die = Proc.new do
    @x=rand(6)+1
end
time = Proc.new do
    t=Time.now
    @x="Сейчас #{t.hour}:#{t.min}"
end
log "внешний блок", power(3)
log "другой небольшой блок", die
log "ещё один блок", time
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
25.02.2018, 16:06
Ответы с готовыми решениями:

Избавиться от повторения вызова одного и того же метода с одним меняющимся параметром
struct Marker { public static string chipValue= '\&quot;' + &quot;Value&quot; + '\&quot;'; public static string...

Выбор метода для вызова с varags параметрами
Какой результат попытки компиляции и запуска программы: public class MainClass { public static void test(int ...a) { ...

Передача всего объекта в метод Main для вызова метода
Добрый день! Подскажите пожалуйста. Есть например класс Student. В нём есть свойства IdStudentKurs LastName FirstName IdGroup ...

6
the hardway first
Эксперт JS
 Аватар для j2FunOnly
2475 / 1847 / 910
Регистрация: 05.06.2015
Сообщений: 3,610
25.02.2018, 16:55
Лучший ответ Сообщение было отмечено EvilDog17 как решение

Решение

Всё не так
Ruby
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#протоколирование
def log(s, x = nil, &someProc)
  puts %Q(Начинаю выполнять "#{s}"...)
  result = someProc.call(x)
  puts %Q(..."#{s}" закончен.)
  puts "Результат: #{result}"
end
 
power = Proc.new do |x|
  x ** 3
end
 
die = Proc.new do
  rand(6) + 1
end
 
time = Proc.new do
  t = Time.now
  "Сейчас #{t.hour}:#{t.min}"
end
 
log "внешний блок", 3, &power
log "другой небольшой блок", &die
log "ещё один блок", &time
https://repl.it/repls/LowestElaborateDemoware
1
11 / 11 / 8
Регистрация: 06.01.2018
Сообщений: 134
25.02.2018, 17:03  [ТС]
j2FunOnly, можете, пожалуйста, пояснить все изменения?
0
the hardway first
Эксперт JS
 Аватар для j2FunOnly
2475 / 1847 / 910
Регистрация: 05.06.2015
Сообщений: 3,610
25.02.2018, 17:25
По ошибке - вы вызываете прок, как метод, но прок вызывается #call() или #[].
Если изменить вызов на
Ruby
1
log "внешний блок", power[3]
приведет к следующей ошибке
Code
1
undefined method `**' for nil:NilClass (NoMethodError)
т. к. @x - не определена, а в метод log будет передан результат выполнения прока. Вообще это плохо, что ваши проки знают о существовании каких-то внешних переменных, они должны просто принимать параметр и возвращать результат - т. н. "чистая функция".

Я предположил, что метод log - это метод вызываемый с описанием, параметром (который может отсутствовать) и указанием блока, которому параметр будет передан и выводом некоей информации по ходу выполнения.
Ruby
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
def log(description, param = nil)
  raise ArgumentError, "A block must be given" unless block_given?
 
  puts %Q(Начинаю выполнять "#{description}"...)
 
  result = yield param
 
  puts %Q(..."#{description}" закончен.)
  puts "Результат: #{result}"
end
 
# пример использования
log "внешний блок", 3 do |x|
  x ** 3
end
 
time = Proc.new do
  t = Time.now
  "Сейчас #{t.hour}:#{t.min}"
end
log "ещё один блок", &time
И вместо экранирования кавычек, чтобы не запутаться, можно воспользоваться %-нотацией, да и читается легче
Ruby
1
2
3
  puts %Q(Начинаю выполнять "#{description}"...)
  puts "Начинаю выполнять '#{description}'"
  puts "Начинаю выполнять \"#{description}\"..."
0
11 / 11 / 8
Регистрация: 06.01.2018
Сообщений: 134
25.02.2018, 17:47  [ТС]
j2FunOnly, а зачем нам амперсанды при указании прока в вызове метода?
0
the hardway first
Эксперт JS
 Аватар для j2FunOnly
2475 / 1847 / 910
Регистрация: 05.06.2015
Сообщений: 3,610
25.02.2018, 18:09
Таким образом вы указываете, что в метод передаётся прок/лямбда. Вообще это очень долгая история, могу посоветовать ознакомиться: methods, ruby splats, ruby ampersand parameter.
0
11 / 11 / 8
Регистрация: 06.01.2018
Сообщений: 134
25.02.2018, 20:49  [ТС]
j2FunOnly, вроде разобрался. Спасибо большое. А не могли бы Вы ещё в этой теме Написать метод, который принимает один из двух блоков и вызывает его каждый час или каждую минуту ответить?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
25.02.2018, 20:49
Помогаю со студенческими работами здесь

Проверить возможность вызова метода из другого метода
Всем привет. Тут возникла мысля, что было бы здорово отследить все возможные вызовы метода Foo() из другого определенного метода...

Артефакт при осуществлении первой попытки обратного вызова для метода onAccessibilityStateChanged
Я использую в своем приложении функциональность, связанную с дополнительными возможностями, представляемыми через использование служб...

Метод фрагмента onResume() перестает вызываться после вызова метода recreate() для Activity
Такая проблема:после вызова метода recreate() методы фрагментов onCreate() and onCreateView() вызываются, а он Resume() - нет! Но если...

Создать массив с миллионом ключей, использовать (for, map and forEach) и узнать время вызова для каждого метода
Дана задача, помогите пожалуйста разобраться: Create array with 1000000 keys and use loop (for, map and forEach) and check call time for...

Сбой вызова метода из-за отсутствия в [System.Object[]] метода с именем "op_Division"
При разборе скрипта, найденного на просторах интернета (Создание пользовательского объекта), появилась ошибка clear ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru