Ошибка: попытка вызова частного метода
Из длинной истории синтаксиса C-стиля и теперь пытаясь узнать Ruby (on Rails), у меня была своя доля проблем с ее идиомами и т.д., но сегодня я ударил один, я не ожидал есть проблема, и я не вижу, что это такое, что должно быть прямо перед моим лицом.
У меня есть двоичный класс, который включает частный метод для получения значения URI из значения пути (uri и path являются атрибутами класса). Я вызываю self.get_uri_from_path()
из Binary.upload()
, но получаю:
Attempt to call private method
Фрагмент модели выглядит следующим образом:
class Binary < ActiveRecord::Base
has_one :image
def upload( uploaded_file, save = false )
save_as = File.join( self.get_bin_root(), '_tmp', uploaded_file.original_path )
# write the file to a temporary directory
# set a few object properties
self.path = save_as.sub( Rails.root.to_s + '/', '' )
self.uri = self.get_uri_from_path()
end
private
def get_uri_from_path
return self.path.sub( 'public', '' )
end
end
Я неправильно звоню? Я пропустил что-то еще, что еще более фундаментально? Единственное место, из которого Binary.get_uri_from_path()
вызывается из - в данный момент - это Binary.upload()
. Я ожидал, что сможет вызвать частный метод из одного класса, если Ruby не делает что-то заметно отличное от других языков, которые я использовал.
Спасибо.
Ответы
Ответ 1
Не выполняйте
self.get_uri_from_path()
делать
get_uri_from_path()
Потому что...
class AccessPrivate
def a
end
private :a # a is private method
def accessing_private
a # sure!
self.a # nope! private methods cannot be called with an explicit receiver at all, even if that receiver is "self"
other_object.a # nope, a is private, you can't get it (but if it was protected, you could!)
end
end
через
Ответ 2
Я считаю, что правильная идиома в этом случае не является self.get_uri_from_path(), а скорее просто get_uri_from_path(). "Я" избыточен. Дальнейшие примечания:
* self.path вызывает метод path на self, который предположительно определен в родительском классе. Если вы хотели получить доступ к переменной экземпляра напрямую, вы могли бы сказать @path. (@- сигил, например, переменные).
* Скобки для аргументов метода являются необязательными, за исключением случаев, когда их отсутствие вызывает неоднозначность. Вы могли бы, если бы вы выбрали, заменить get_uri_from_path() на get_uri_from_path. Это контрастирует с Javascript, где функция без парнов представляет эту функцию как значение, а не приложение этой функции.
Ответ 3
есть черт, хотя там, где вы можете вызвать частный метод в любой ситуации, это:
object.send(:private_method)
Я считаю, что 1.9 имеет другую реализацию этого трюка