Takma ad veya takma ad_method kullanmalı mıyım?


353

Ben bir blog yazısı buldum aliasvs. alias_method. Bu blog yazısında verilen örnekte gösterildiği gibi, ben sadece aynı sınıf içinde başka bir yöntemi takma ad istiyorum. Hangisini kullanmalıyım? Her zaman aliaskullanıldığını görüyorum , ama biri bana alias_methoddaha iyi olduğunu söyledi .

Takma ad kullanımı

class User

  def full_name
    puts "Johnnie Walker"
  end

  alias name full_name
end

User.new.name #=>Johnnie Walker

Alias_method kullanımı

class User

  def full_name
    puts "Johnnie Walker"
  end

  alias_method :name, :full_name
end

User.new.name #=>Johnnie Walker

Blog yayını bağlantısı buraya


4
Bu gönderi sorunuza cevap vermiyor mu?
moinudin

4
@marcog: Okudum ve ikna olmadım. Yöntemler içindeki takma adları tanımlamak, bu sık sık yapılması gereken bir şey değildir.
Boris Stitnicky

2
@digitalextremist link works
lukas.pukenis

4
Yakut stil kılavuzu artık alias"sözcük sınıfı kapsamında diğer adlandırma yöntemleri" ve alias_method"zamanında modüller, sınıflar veya singleton sınıfları yöntemlerini diğer adlandırma yöntemlerinde" github.com/bbatsov/ruby-style-guide#alias-method-lexically
jtzero

Yanıtlar:


380

alias_methodgerekirse yeniden tanımlanabilir. ( Modulesınıfta tanımlanmıştır .)

alias'nin davranışı, kapsamına bağlı olarak değişir ve zaman zaman oldukça öngörülemez olabilir.

Karar: Kullanım alias_method- size bir ton daha fazla esneklik sağlar.

Kullanımı:

def foo
  "foo"
end

alias_method :baz, :foo

43
Öngörülemeyen ne demek istiyorsun. Naif olarak, daha az esnek olan seçeneğin daha öngörülebilir olacağını söyleyebiliriz. Ayrıca, alias_method'un yeniden tanımlanmasından yararlanmanın pratik bir örneğini verebilir misiniz?
Boris Stitnicky

7
örnek kullanım örneği: alias :new_method_name :old_method_nameVEYAalias_method :new_method_name, :old_method_name
boulder_ruby

10
Burada aradığı kelime daha fazla beklenen sonuçtur. alias_methodkodları okunduğunda değil, çalışma zamanında belirlenir alias, bu nedenle kodun nasıl olmasını beklediğimiz daha fazla davranır .
Joshua Pinter

4
yöntemlerin çalışma sırasında anında tanımlanmasını beklemek çoğu programcının beklediği şey değildir. En azından bana uçan domuzlar gibi.
akostadinov

10
Bir için aynı iddia olabilir defvs. define_method: " define_method. Eğer gerekirse yeniden tanımlanabilir (o da tanımlandıysa Module. Sınıfından) def'in davranış kapsamına bağlı olarak değişir ve bazen oldukça farklı olabilmesinin Karar: kullanın. define_method- bu size bir ton verir daha fazla esneklik. "
Daniel Rikowski

62

Sözdizimi dışında , temel fark kapsam belirleme aşamasındadır :

# scoping with alias_method
class User

  def full_name
    puts "Johnnie Walker"
  end

  def self.add_rename
    alias_method :name, :full_name
  end

end

class Developer < User
  def full_name
    puts "Geeky geek"
  end
  add_rename
end

Developer.new.name #=> 'Geeky geek'

Yukarıdaki durumda “name” yöntemi, “Developer” sınıfında tanımlanan “full_name” yöntemini seçer. Şimdi deneyelim alias.

class User

  def full_name
    puts "Johnnie Walker"
  end

  def self.add_rename
    alias name full_name
  end
end

class Developer < User
  def full_name
    puts "Geeky geek"
  end
  add_rename
end

Developer.new.name #=> 'Johnnie Walker'

Takma ad kullanıldığında “name” yöntemi, Developer'da tanımlanan “full_name” yöntemini seçemez.

Bunun nedeni aliasbir anahtar kelime olması ve sözlü olarak kapsamlandırılmasıdır. Bu self, kaynak kodun okunduğu andaki benlik değeri olarak davrandığı anlamına gelir . Buna karşılık çalışma zamanında belirlenen değer olarak alias_methoddavranır self.

Kaynak: http://blog.bigbinary.com/2012/01/08/alias-vs-alias-method.html


35

Bunun aliasyerine lehine bir nokta alias_method, semantiğinin rdoc tarafından tanınması ve oluşturulan dokümantasyonda düzgün çapraz referanslara yol açması ve rdoc'un tamamen görmezden gelmesidir alias_method.


56
Belki RDoc, takma adla aynı takma adı tedavi etmeye başlamalıdır. Onlara bundan bahsetmeliyiz;)
Szymon Jeż

9
RDoc'un çalışma zamanında değerlendirilen bir yöntemin sonuçlarını nasıl anlaması gerekir?

@ user1115652 Birisinin maymun yaması yapmış olabileceği konusunda bir fikriniz var mı alias_method? Bu gerçekten olası görünmüyor ve eğer birisi bunu yaparsa, RDoc'un sonuçlarına maruz kalmaya istekli olmalılar. Demek istediğin imkansızsa, neden bunu düşünüyorsun ve sizce Yardoc bunu nasıl yapıyor?
iconoclast

35

Kod kullanıcısına birden fazla adla bir yöntem vermek istiyorsanız, yalnızca bir yöntem adı takma adı kaydetmek için 'takma ad' kullanmayı söyleyen yazılı olmayan bir kural (kongre gibi bir şey) olduğunu düşünüyorum:

class Engine
  def start
    #code goes here
  end
  alias run start
end

Kodunuzu genişletmeniz gerekiyorsa, ruby ​​meta alternatifini kullanın.

class Engine
  def start
    puts "start me"
  end
end

Engine.new.start() # => start me

Engine.class_eval do
  unless method_defined?(:run)
    alias_method :run, :start
    define_method(:start) do
      puts "'before' extension"
      run()
      puts "'after' extension"
    end
  end
end

Engine.new.start
# => 'before' extension
# => start me
# => 'after' extension

Engine.new.run # => start me

23

Soruyu sorduktan bir yıl sonra konuyla ilgili yeni bir makale geliyor:

http://erniemiller.org/2014/10/23/in-defense-of-alias/

Görünüşe göre "çok fazla adam, çok fazla zihin". Önceki makaleden yazar kullanmayı teşvik alias_methodederken, ikincisi kullanmayı önermektedir alias.

Bununla birlikte, hem blog yazılarında hem de yukarıdaki yanıtlarda bu yöntemlere ortak bir genel bakış vardır:

  • kullanmak aliasistediğiniz zaman onu tanımlanan kapsamına sınır aliasing için
  • alias_methodmiras alınan sınıfların ona erişmesine izin vermek için kullanın

16

Rubocop mücevher katılımcıları Ruby Stil Rehberinde önermektedir :

Bu bağlamda kendiliğin çözümü olarak sözcüksel sınıf kapsamındaki diğer adlandırma yöntemlerinde takma ad da tercih edilir ve kullanıcıya açık olarak belirtilmediği sürece takma adınızın indirilmesinin çalışma zamanında veya herhangi bir alt sınıf tarafından değiştirilmeyeceğini açıkça bildirir.

class Westerner
  def first_name
   @names.first
  end

 alias given_name first_name
end

Takma adın sözlük kapsamı bu durumlarda öngörülemezliğe yol açtığından, çalışma zamanında modüllerin, sınıfların veya singleton sınıflarının takma yöntemlerini her zaman alias_method kullanın

module Mononymous
  def self.included(other)
    other.class_eval { alias_method :full_name, :given_name }
  end
end

class Sting < Westerner
  include Mononymous
end

0

takma ad_method new_method , old_method

old_method , şimdi new_method'un kullanılacağı sınıfımıza devralınan bir sınıf veya modülde bildirilecektir .

bunların her ikisi de değişken veya yöntem olabilir.

Sınıf_1'nin old_method olduğunu ve Sınıf_2 ve Sınıf_3'ün her ikisinin de Sınıf_1'yi devraldığını varsayalım.

Class_2 ve Class_3 öğelerinin başlatılması Class_1 içinde yapılırsa, her ikisinin de Class_2 ve Class_3 ve kullanımı içinde farklı bir adı olabilir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.