LINUX.ORG.RU

Гибкость Ruby


0

0

# красиво, неправда ли?

DEBUG=1

def debug(message)
    if DEBUG == 1 and (block_given? ? yield : true )
        STDERR.puts "DEBUG: #{message}"
    end
end

# вызов

debug("Зашли в метод method1")

# или 

debug("Зашли в метод method1") { self.class.name =~ /MyClass1/}

># красиво, неправда ли?

Неправда. IMHO.

DonkeyHot ★★★★★
()
Ответ на: комментарий от anonymous

> > block_given? ? yield

> Количество знаков вопроса радует.

это просто конструкция (condition)?true:false

и метод под названием block_given?

:)

geshido
() автор топика
Ответ на: комментарий от cobold

> Может и красиво, но я не осилил красоты, т.к. не понял что здесь происходит.

допустим, нужно тебе выводить дебажные сообщение в каком-нибудь месте программы. выводить их или не выводить ты можешь регулировать с помощью константы DEBUG, а также с помощью дополнительного условия, передаваемого в функцию debug в виде блока кода (как это во втором примере, где сообщение выводится только в том случае, если это происходит внутри объекта класса MyClass1).

geshido
() автор топика
Ответ на: комментарий от geshido

>можешь регулировать с помощью константы DEBUG,

С помощью константы DEBUG можно было регулировать если не ошибаюсь еще в 1980-м году в FORTRANе и Паскале.

>а также с помощью дополнительного условия, передаваемого в функцию debug в виде блока кода

А почему не передавать в функцию результат выполнения блока кода в виде значения переменной? Ась?

Зачем тебе вычислять этот блок кода ИМЕННО в функции DEBUG?? Эта функция что, ближе всего семантически к данным?

anonymous
()

def debug(s):
    if DEBUG==1:
        sys.stderr.write("DEBUG: " + s)

if(my_var.__class__ == MyClass1):    debug("Зашли в метод method1")

seiken ★★★★★
()
Ответ на: комментарий от anonymous

>С помощью константы DEBUG можно было регулировать если не ошибаюсь еще в 1980-м году в FORTRANе и Паскале.

А разве не с перфокарт?

seiken ★★★★★
()

В чем собственно вопрос? В руби еще много чего интересного есть и что после каждого открытия ты будешь постить новое сообщение?

aton
()

дурацкий какой-то топик.. //

romka
()
Ответ на: комментарий от anonymous

> А почему не передавать в функцию результат выполнения блока кода в виде значения переменной? Ась?

Потому что при выключении DEBUG, блок кода, вычисляемый внутри функции вычисляться перестанет, ибо не надо, а блок кода, вычисляющий условие ДО вызова функции будет вычисляться в любом случае.

Но в данном случае, это всё-равно фигня, т.к. останется вызов debug и вычисление ее аргумента. LISP рулит :)

watashiwa_daredeska ★★★★
()
Ответ на: комментарий от geshido

Синтаксически не так красиво, но суть, по-моему, та же :)

davidov@music:~/tmp/cpp$ cat 1.c 
#define DEBUG 1
#define P(x) printf("%s\n",(x))
#define D(x, ...)  ((1,##__VA_ARGS__)&&DEBUG?P(x):0)
#include <stdio.h>

int main()
{
        int y=0;
        P("test_p");
        D("test_d");
        D("test_y0",y==0);
        D("test_y1",y==1);


}
davidov@music:~/tmp/cpp$ ./1 
test_p
test_d
test_y0

Davidov ★★★★
()
Ответ на: комментарий от Davidov

> Синтаксически не так красиво, но суть, по-моему, та же :)

А теперь, условие требуется нечетность суммы четных элементов массива, при его длине 5 и более, а в message должны быть 5 первых элементов этого массива. Смогёшь, не меняя приведенных дефиниций? :)

watashiwa_daredeska ★★★★
()
Ответ на: комментарий от watashiwa_daredeska

>А теперь, условие требуется нечетность суммы четных элементов массива, при его длине 5 и более, а в message должны быть 5 первых элементов этого массива. Смогёшь, не меняя приведенных дефиниций? :)

Смогу с использованием декомпозиции :) (что в общем-то верно в данном случае)

Но мысль понял :)

Davidov ★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.