Я пытаюсь перенести программу Python в Ruby, но я совершенно не осведомлен о Python.
Не могли бы вы дать мне какие-нибудь советы?
Я хочу запустить метод sampletrain
. Однако я не понимаю, почему features=self.getfeatures(item)
. getfeatures
- это просто переменная экземпляра, не так ли? Кажется, он используется как метод.
class classifier:
def __init__(self,getfeatures,filename=None):
# Counts of feature/category combinations
self.fc={}
# Counts of documents in each category
self.cc={}
self.getfeatures=getfeatures
def train(self,item,cat):
features=self.getfeatures(item)
# Increment the count for every feature with this category
for f in features:
self.incf(f,cat)
# Increment the count for this category
self.incc(cat)
self.con.commit()
def sampletrain(cl):
cl.train('Nobody owns the water.','good')
cl.train('the quick rabbit jumps fences','good')
cl.train('buy pharmaceuticals now','bad')
cl.train('make quick money at the online casino','bad')
cl.train('the quick brown fox jumps','good')
В Python, поскольку скобки для вызова метода не являются необязательными, можно различать ссылку на метод и вызов метода. т.е.
def example():
pass
x = example # x is now a reference to the example
# method. no invocation takes place
# but later the method can be called as
# x()
против
x = example() # calls example and assigns the return value to x
Поскольку скобки для вызова метода необязательны в Ruby, вам нужно использовать какой-то дополнительный код, например x = method(:example)
и x.call
чтобы достичь того же.
initialize
чтобы принять блок, как предложено tokland, в зависимости от того, хотите ли вы предоставить именованный метод или анонимный блок для функциональности getfeatures
. Если вам нужны подробности, просто дайте мне знать.
Идиоматический способ отправки поведения в Ruby (поскольку getfeatures
в вашем коде явно вызываемый) заключается в использовании блоков:
class Classifier
def initialize(filename = nil, &getfeatures)
@getfeatures = getfeatures
...
end
def train(item, cat)
features = @getfeatures.call(item)
...
end
...
end
Classifier.new("my_filename") do |item|
# use item to build the features (an enumerable, array probably) and return them
end
Если вы переводите с Python, вам нужно будет изучить Python, чтобы вы не были "совершенно неосведомлены" об этом. Нет коротких сокращений.