2013-11-27 5 views
1

Скажем, у меня есть этот объект:Условные аргументы ключевых слов (Ruby 2.0)

class Post 
    def initialize(title: 'title', content: 'content') 
    @title = title 
    @content = content 
    end 
end 

, но я хотел бы добавить логику, как:

class Post 
    def initialize(title: 'title', content: 'content') 
    @title = title unless title.empty? # if it's empty I'd like to use the default value 
    @content = content unless content.empty? 
    end 
end 

В приведенном выше примере, как я назначить условно?

+1

Ессенции ваш вопрос, является ли метод (а не только 'initialize') можно получить значения параметров по умолчанию оно прошло. Вы можете получить метод вызова с помощью [Kernel # caller] (http://www.ruby-doc.org/core-2.0.0/Kernel.html#method-i-caller) и некоторую информацию о аргументах с помощью [Метод @ # параметры] (http://www.ruby-doc.org/core-2.0.0/Method.html#method-i-parameters). Учитывая, что значения по умолчанию могут быть вычислены и что у Ruby нет причин сделать их доступными для вызываемого метода, я очень сомневаюсь, что есть способ получить их от вызываемого метода. Однако, .. –

+1

... вы можете взглянуть на метод get_args для [merb gem] (http://rubydoc.info/github/merb/merb/master/GetArgs). –

ответ

1

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

(я) Сделать аргументы obilgatory (т.е. передать nil или пустое значение, а не не передавая аргумент), и сделать проверку в теле метода:

class Post 
    def initialize(title, content) 
    @title = title.nil? || title.empty? ? "title" : title 
    @content = content.nil? || content.empty? ? "content" : content 
    end 
end 

(б) Вместо передачи пустого значения в качестве аргумента, не передать его:

class Post 
    def initialize(title: "title", content: "content") 
    @title, @content = title, content 
    end 
end 
+0

спасибо, я кое-что узнал :) – shicholas

1

Почему не устанавливается по умолчанию в отдельный метод, а затем объединить в аргументы, переданные при инициализации? Если аргументы не передаются, то значения по умолчанию вставляются. В противном случае значения по умолчанию перезаписываются аргументами, переданными при инициализации.

Например:

class Post 
    def initialize(options) 
    options = defaults.merge(options) 
    @title = options[:title] 
    @content = options[:content] 
    end 

    def defaults 
    { 
     title: "Your Default Title" 
     content: "Your Default Content" 
    } 
    end 
... 
end 
Смежные вопросы