Каковы прописные и строчные правила имени метода ruby?

У меня был алгоритм перестановки, который я использовал для эйлера проекта, в python:

def missing(miss,src):
    "Returns the list of items in src not present in miss"
    return [i for i in src if i not in miss]


def permutation_gen(n,l):
    "Generates all the permutations of n items of the l list"
    for i in l:
        if n<=1: yield [i]
        r = [i]
        for j in permutation_gen(n-1,missing([i],l)):  yield r+j

Если

n<len(l) 

вы должны иметь всю комбинацию, которая вам нужна без повторения,

Это генератор, поэтому вы используете его примерно так:

for comb in permutation_gen(3,list("ABCDEFGH")):
    print comb 
16
задан mu is too short 13 August 2012 в 06:35
поделиться

2 ответа

[

]По общему правилу, вещи, которые начинаются с прописных букв, являются []константами []. Когда вы вызываете []SayHi[], вы говорите Руби искать [] константу с таким именем []. Конечно, такой константы нет, поэтому она не работает.[

] [

]Если вы хотите вызвать метод, вам нужно добавить пару скобок. Например[

] [
def S
  puts "shazam!"
end

S    #=> NameError: uninitialized constant S
S()  #=> "shazam!"
] [

]Внутри класса правила разрешения немного отличаются. Определим простой класс с константой и метод с именем, похожим на константу:[

] [
irb(main):001:0> class C
irb(main):002:1>   A = "x"
irb(main):003:1>   def B
irb(main):004:2>     puts "B() invoked"
irb(main):005:2>   end
irb(main):006:1> end
=> nil
] [

]Теперь, []A[], конечно же, является константой. А как же []B[]?[

] [
irb(main):008:0> C.const_defined?("A")
=> true    # A is a constant!
irb(main):009:0> C.const_defined?("B")
=> false   # B looks like a constant but isn't, because we
           # used "def" to create it. "def" is for methods,
           # not constants.
] [

]Так что это не константа, а просто метод с таким именем. Когда мы пытаемся получить доступ к []B[] из экземпляра []C[], теперь Руби ищет метод:[

] [
irb(main):011:0> C.new.B
B() invoked
=> nil
] [

] Если мы хотим получить доступ к константе []C[], вместо нее мы используем классификатор scope []::[]:[

] [
irb(main):012:0> C::A
=> "x"
]
27
ответ дан 30 November 2019 в 21:10
поделиться
[

] Не делайте ничего из того, что вы пытаетесь сделать. Это плохой стиль кодирования.[

] [

]Хороший стиль кодирования Ruby:[

] [
def method_name
end

# or

class CamelCase
  def method_name(parameter_name)
  end
end
] [

]Почти все остальное просто неправильно. Язык может позволить вам делать и другие вещи, но это не значит, что вы должны.[

] [

]Также, в общем, вы не хотите определять методы вне класса или модуля - это допустимо в коротких скриптах, но не в проектах по существу.[

]
1
ответ дан 30 November 2019 в 21:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: